Dask.distributed

Dask.distributed

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

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

动机

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

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

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

  • 复杂调度:支持复杂的 workflow(不仅仅是 map/filter/reduce),这对于 nd-arrays、机器学习、图像处理和统计中使用的复杂算法至关重要。

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

  • 数据本地性:调度算法巧妙地在数据所在的位置执行计算。这最大限度地减少了网络流量并提高了效率。

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

  • 易于设置:作为一个纯 Python 包,distributed 可以通过 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 接口则在用户想要跳出预设的“大数据”抽象并提交完全自定义的工作负载时,提供了自定义控制。