• Dask
  • Distributed
  • Dask ML
  • Examples
  • Ecosystem
  • Community

Dask.distributed 2024.9.1+2.g36020d6a 文档

入门指南

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

构建理解

  • 诊断性能
  • 效率
  • 限制
  • 数据局部性
  • 日志记录
  • 管理计算
  • 内存管理
  • 优先处理工作
  • 相关工作
  • 韧性
  • 调度策略
  • 调度器状态机
  • 工人
  • 工作状态机
  • Worker 内存管理
  • 工作窃取
  • 为什么我的工作进程会死亡?

附加功能

  • 演员
  • 异步操作
  • HTTP 端点
  • 发布数据集
  • 工作资源
  • 从任务启动任务
  • TLS/SSL
  • 活动内存管理器
  • 普罗米修斯监控
  • 良好的性能指标
  • 跨度

开发者文档

  • 更新日志
  • 通信
  • 开发指南
  • 基础
  • 任务的旅程
  • 协议
  • 序列化
  • 插件
Theme by the Executable Book Project
内容
  • 大数据世界
  • Python 项目
    • 任务调度
    • 临时计算
    • 直接通信
    • 尊敬的
  • 关系
  • 深入比较特定项目
    • IPython 并行
    • concurrent.futures

相关工作

内容

  • 大数据世界
  • Python 项目
    • 任务调度
    • 临时计算
    • 直接通信
    • 尊敬的
  • 关系
  • 深入比较特定项目
    • IPython 并行
    • concurrent.futures

相关工作¶

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

您可能也会对 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: 封装了在高性能计算中流行的消息传递接口。

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

尊敬的¶

有一些较老的项目经常被提及

  • Dispy: 令人尴尬的并行函数评估

  • Pyro: 远程对象 / RPC

关系¶

关于这些项目 distributed…

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

  • 使用带有数据依赖抽象的任务图,如 Luigi

  • 为了支持临时应用程序,如 IPython Parallel 和 Scoop

深入比较特定项目¶

IPython 并行¶

简短描述

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

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

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 相对于 IPython Parallel 的主要优势包括

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

  2. 动态任务调度

Distributed 工作者以点对点的方式共享数据,无需通过中央瓶颈发送中间结果。这使得 distributed 对于更复杂的算法更为有效,并且能够以更自然的方式管理更大的数据集。IPython parallel 没有提供工作者之间直接通信的机制,除非通过使用中央节点作为数据传输的中介,或者依赖其他媒介,如共享文件系统。通过中央节点进行数据传输很容易成为瓶颈,因此 IPython parallel 主要在令人尴尬的并行工作(大部分应用)中有所帮助,但在需要非平凡通信模式的更复杂算法中并未得到广泛应用。

分布式客户端包含一个动态任务调度器,能够管理任务之间深层次的数据依赖关系。IPython 并行文档中包含 一个配方 用于执行具有数据依赖关系的任务图。这一概念是所有 distributed 的核心,它使用动态任务调度器来处理所有操作。值得注意的是,在 submit/map/get 调用中,distributed.Future 对象可以在完成之前使用。

>>> 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 方法中廉价地使用期货的能力,使得可以用简单的代码构建非常复杂的数据管道。此外,distributed 可以作为完整的 dask 任务调度器,支持分布式数组、数据帧、机器学习管道以及任何基于 dask 图构建的其他应用程序。distributed 中的动态任务调度器改编自 dask 任务调度器,因此相当复杂/高效。

IPython 并行优势

IPython Parallel 相对于 distributed 有以下优势

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

  2. 对工作进程的显式控制:IPython parallel 允许你在工作进程上执行任意语句,使其能够用于系统管理任务。

  3. 部署帮助:IPython Parallel 内置了在 SGE、MPI 等平台上部署的机制。Distributed 虽然没有这样的便捷功能,但手动 设置 相当简单。

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

concurrent.futures¶

The distributed.Client API 是基于 concurrent.futures 和 PEP 3148 设计的。它有一些显著的不同之处:

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

  • The map() method returns Future objects, not concrete results. The map() method returns immediately.

  • 尽管共享类似的API,distributed Future 对象不能总是替代 concurrent.futures.Future 对象,尤其是在使用 wait() 或 as_completed() 时。

  • 分布式通常不支持回调。

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

上一页

优先处理工作

下一页

韧性

通过 Anaconda, Inc.
© 版权 2016, Anaconda, Inc..