• Dask
  • 分布式
  • Dask ML
  • 示例
  • 生态系统
  • 社区

Dask.distributed 2025.5.0 文档

入门

  • 安装 Dask.Distributed
  • 快速入门
  • 设置
  • 客户端
  • API
  • 示例
    • HDFS 中的词频统计
  • 常见问题

构建理解

  • 诊断性能
  • 效率
  • 限制
  • 数据本地性
  • 日志记录
  • 管理计算
  • 管理内存
  • 工作优先级
  • 相关工作
  • 弹性
  • 调度策略
  • 调度器状态机
  • 工作节点
  • 工作节点状态机
  • 工作节点内存管理
  • 工作窃取
  • 为什么我的工作节点死了?

附加功能

  • Actors
  • 异步操作
  • HTTP 端点
  • 发布数据集
  • 工作节点资源
  • 从任务启动任务
  • TLS/SSL
  • 活动内存管理器
  • Prometheus 监控
  • 精细性能指标
  • 跨度

开发者文档

  • 变更日志
  • 通信
  • 开发指南
  • 基础
  • 任务的旅程
  • 协议
  • 序列化
  • 插件
由 Executable Book Project 设计的主题
目录
  • 大数据领域
  • Python 项目
    • 任务调度
    • 即席计算
    • 直接通信
    • 历史悠久的项目
  • 关系
  • 与特定项目的深入比较
    • IPython Parallel
    • concurrent.futures

相关工作

目录

  • 大数据领域
  • Python 项目
    • 任务调度
    • 即席计算
    • 直接通信
    • 历史悠久的项目
  • 关系
  • 与特定项目的深入比较
    • IPython Parallel
    • concurrent.futures

相关工作¶

为名为“distributed”的项目撰写“相关工作”是一项西西弗斯式的工作。我们将在下面列出一些您可能已经听说过的著名项目。

您可能也会对 dask 与 spark 的比较 感兴趣。

大数据领域¶

  • 历史悠久的 Hadoop 提供了采用 MapReduce 编程范式的批处理。Python 用户通常使用 Hadoop Streaming 或 MRJob。

  • Spark 在 HDFS 系统之上构建,具有更好的 API 和内存处理能力。Python 用户通常使用 PySpark。

  • Storm 提供了流式计算。Python 用户通常使用 streamparse。

这远远不足以代表该领域蓬勃发展的出色工作。许多项目已经进入这个领域,与上述项目竞争或互补。尽管如此,大多数关于“大数据”处理的热议可能仍然围绕着上述三个项目或它们的派生项目。

Python 项目¶

有数十个用于分布式计算的 Python 项目。这里我们列出一些目前仍在积极使用的、更为突出的项目。

任务调度¶

  • Celery:一个异步任务调度器,专注于实时处理。

  • Luigi:一个大规模大数据/批处理任务调度器,与多种有趣的数据源有连接。

即席计算¶

  • IPython Parallel:允许对多个正在运行的 ipython 会话进行有状态的远程控制。

  • Scoop:在分布式工作节点上实现了 concurrent.futures API。特别值得注意的是,它允许任务生成更多任务。

直接通信¶

  • MPI4Py:封装了高性能计算中流行的消息传递接口 (Message Passing Interface)。

  • PyZMQ:封装了 ZeroMQ,这是一个高性能的异步消息库。

历史悠久的项目¶

有一些经常被提及的旧项目

  • Dispy:高度并行函数评估

  • Pyro:远程对象 / RPC

关系¶

与这些项目相比,distributed…

  • 支持像 Hadoop 和 Spark 那样的数据本地计算

  • 使用像 Luigi 那样带有数据依赖关系的任务图抽象

  • 支持即席应用,如 IPython Parallel 和 Scoop

与特定项目的深入比较¶

IPython Parallel¶

简述

IPython Parallel 是 IPython 项目的一个分布式计算框架。它使用一个中心枢纽将作业分发给在远程工作节点上运行的多个 ipengine 进程。它通过 ZeroMQ 套接字通信,并集中所有通信通过中心枢纽。

IPython parallel 已经存在一段时间了,虽然不是特别花哨,但它非常稳定和健壮。

IPython Parallel 提供了并行 map 和远程 apply 函数,将计算路由到远程工作节点。

>>> view = Client(...)[:]
>>> results = view.map(func, sequence)
>>> result = view.apply(func, *args, **kwargs)
>>> future = view.apply_async(func, *args, **kwargs)

它还提供在远程进程中直接执行代码以及从远程命名空间收集数据的功能。

>>> view.execute('x = 1 + 2')
>>> view['x']
[3, 3, 3, 3, 3, 3]

简要比较

Distributed 和 IPython Parallel 在以下方面相似:它们都为运行 Python 的分布式工作进程提供了 map 和 apply/submit 抽象。两者都管理这些工作进程的远程命名空间。

它们的不同之处在于它们的成熟度、工作节点之间的通信方式以及它们所支持的算法的复杂性。

Distributed 的优势

distributed 相对于 IPython Parallel 的主要优势包括

  1. 工作节点之间的点对点通信

  2. 动态任务调度

Distributed 工作节点以点对点方式共享数据,无需通过中心瓶颈发送中间结果。这使得 distributed 对于更复杂的算法更加有效,并能以更自然的方式管理大型数据集。IPython parallel 没有提供工作节点相互通信的机制,除非使用中心节点作为数据传输的中介,或者依赖于其他介质,例如共享文件系统。通过中心节点进行数据传输很容易成为瓶颈,因此 IPython parallel 主要适用于高度并行(embarrassingly parallel)的工作(大多数应用),但并未广泛用于需要复杂通信模式的更精密算法。

distributed 客户端包含一个能够管理任务之间深层数据依赖关系的动态任务调度器。IPython parallel 文档中包含一个执行带有数据依赖关系的任务图的方法。这个想法是 distributed 所有操作的核心,它使用动态任务调度器处理所有操作。值得注意的是,distributed.Future 对象可以在 submit/map/get 调用中使用,即使它们尚未完成。

>>> x = client.submit(f, 1)  # returns a future
>>> y = client.submit(f, 2)  # returns a future
>>> z = client.submit(add, x, y)  # consumes futures

在 submit 和 map 方法中廉价地使用 futures 的能力使得可以用简单的代码构建非常复杂的数据管道。此外,distributed 可以作为一个完整的 dask 任务调度器,支持分布式数组、数据帧、机器学习管道以及任何基于 dask 图构建的其他应用。distributed 中的动态任务调度器是基于 dask 任务调度器改进的,因此相当复杂/高效。

IPython Parallel 的优势

IPython Parallel 相对于 distributed 具有以下优势

  1. 成熟度:IPython Parallel 已经存在一段时间了。

  2. 对工作节点的显式控制:IPython parallel 允许您在工作节点上执行任意语句,使其可用于系统管理任务。

  3. 部署帮助:IPython Parallel 内置了帮助部署到 SGE、MPI 等的机制。Distributed 没有这样的便利功能,但可以手动设置,相当简单。

  4. 其他各种优势:多年来,IPython parallel 积累了各种有用的功能,例如 IPython 交互魔术命令、@parallel 装饰器等。

concurrent.futures¶

distributed.Client API 模仿了 concurrent.futures 和 PEP 3148。它有一些显著的区别

  • distributed 在调用 submit/map 时接受 Future 对象。当需要链式计算时,最好直接提交 Future 对象,而不是在提交之前等待它们完成。

  • map() 方法返回 Future 对象,而不是具体结果。map() 方法会立即返回。

  • 尽管 API 相似,但 distributed Future 对象并非总能替代 concurrent.futures.Future 对象,尤其是在使用 wait() 或 as_completed() 时。

  • Distributed 通常不支持回调函数。

如果您需要与 concurrent.futures.Executor API 完全兼容,请使用 get_executor() 方法返回的对象。

上一页

工作优先级

下一页

弹性

由 Anaconda, Inc. 提供。
© 版权所有 2016, Anaconda, Inc..