Dask.distributed

Dask.distributed

Dask.distributed 是一个用于 Python 分布式计算的轻量级库。它扩展了 concurrent.futuresdask API,以适应中等大小的集群。

请参阅 快速入门 以开始使用。

动机

Distributed 旨在补充现有的 PyData 分析栈。特别是它满足了以下需求:

  • 低延迟: 每个任务大约有1毫秒的开销。一个小型计算和网络往返可以在不到10毫秒内完成。

  • 点对点数据共享: 工人之间相互通信以共享数据。这消除了数据传输中的中央瓶颈。

  • 复杂调度: 支持复杂的流程(不仅仅是映射/过滤/归约),这对于在nd数组、机器学习、图像处理和统计中使用的复杂算法是必要的。

  • 纯Python: 使用众所周知的技术在Python中构建。这简化了安装,提高了效率(对于Python用户),并简化了调试。

  • 数据局部性: 调度算法巧妙地在数据所在的位置执行计算。这最小化了网络流量并提高了效率。

  • 熟悉的API: 兼容Python标准库中的 concurrent.futures API。 兼容 dask API 用于并行算法。

  • 简单设置: 作为一个纯Python包,可以通过 pip 安装,并且易于 在你的集群上设置

架构

Dask.distributed 是一个集中管理的、分布式的、动态任务调度器。中央 dask scheduler 进程协调分布在多台机器上的多个 dask worker 进程以及多个客户端的并发请求。

调度器是异步且事件驱动的,同时响应来自多个客户端的计算请求,并跟踪多个工作者的进度。事件驱动和异步的特性使其能够灵活地同时处理来自多个用户的各种工作负载,同时还能处理动态的工作者群体,包括失败和新增。工作者之间通过TCP进行批量数据传输。

在内部,调度器将所有工作跟踪为一个不断变化的、以任务为节点的有向无环图。任务是一个操作Python对象的Python函数,这些对象可以是其他任务的结果。随着用户提交更多的计算,这个任务图会增长;随着工作者完成任务,图会填充;随着用户离开或对之前的结果失去兴趣,图会缩小。

用户通过将本地 Python 会话连接到调度器并提交工作来进行交互,可以通过简单接口 client.submit(function, *args, **kwargs) 的单个调用来完成,或者通过使用父 dask 库中的大数据集合和并行算法来完成。dask 库中的集合,如 dask.arraydask.dataframe,提供了对复杂算法和类似 NumPy 和 Pandas 的熟悉 API 的轻松访问,而简单的 client.submit 接口则为用户提供了自定义控制,当他们想要突破预设的“大数据”抽象并提交完全自定义的工作负载时。