相关工作
目录
相关工作¶
为名为“distributed”的项目撰写“相关工作”是一项西西弗斯式的工作。我们将在下面列出一些您可能已经听说过的著名项目。
您可能也会对 dask 与 spark 的比较 感兴趣。
大数据领域¶
历史悠久的 Hadoop 提供了采用 MapReduce 编程范式的批处理。Python 用户通常使用 Hadoop Streaming 或 MRJob。
Spark 在 HDFS 系统之上构建,具有更好的 API 和内存处理能力。Python 用户通常使用 PySpark。
Storm 提供了流式计算。Python 用户通常使用 streamparse。
这远远不足以代表该领域蓬勃发展的出色工作。许多项目已经进入这个领域,与上述项目竞争或互补。尽管如此,大多数关于“大数据”处理的热议可能仍然围绕着上述三个项目或它们的派生项目。
Python 项目¶
有数十个用于分布式计算的 Python 项目。这里我们列出一些目前仍在积极使用的、更为突出的项目。
即席计算¶
IPython Parallel:允许对多个正在运行的 ipython 会话进行有状态的远程控制。
Scoop:在分布式工作节点上实现了 concurrent.futures API。特别值得注意的是,它允许任务生成更多任务。
关系¶
与这些项目相比,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 的主要优势包括
工作节点之间的点对点通信
动态任务调度
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
具有以下优势
成熟度:IPython Parallel 已经存在一段时间了。
对工作节点的显式控制:IPython parallel 允许您在工作节点上执行任意语句,使其可用于系统管理任务。
部署帮助:IPython Parallel 内置了帮助部署到 SGE、MPI 等的机制。Distributed 没有这样的便利功能,但可以手动设置,相当简单。
其他各种优势:多年来,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()
方法返回的对象。