相关工作
内容
相关工作¶
为名为“分布式”的项目撰写“相关工作”是一项西西弗斯式的任务。我们将在下面列出一些你可能已经听说过的著名项目。
您可能也会对 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 并行¶
简短描述
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 的主要优势包括
工作者之间的点对点通信
动态任务调度
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
有以下优势
成熟度: IPython Parallel 已经存在了一段时间。
对工作进程的显式控制:IPython parallel 允许你在工作进程上执行任意语句,使其能够用于系统管理任务。
部署帮助:IPython Parallel 内置了在 SGE、MPI 等平台上部署的机制。Distributed 虽然没有这样的便捷功能,但手动 设置 相当简单。
其他各种优势:多年来,IPython parallel 积累了各种有用的功能,如 IPython 交互魔法、
@parallel
装饰器等。
concurrent.futures¶
The distributed.Client
API 是基于 concurrent.futures
和 PEP 3148 设计的。它有一些显著的不同之处:
distributed
在调用submit/map
时接受Future
对象。在链接计算时,最好直接提交 Future 对象,而不是在提交前等待它们。The
map()
method returnsFuture
objects, not concrete results. Themap()
method returns immediately.尽管共享类似的API,
distributed
Future
对象不能总是替代concurrent.futures.Future
对象,尤其是在使用wait()
或as_completed()
时。分布式通常不支持回调。
如果你需要与 concurrent.futures.Executor
API 完全兼容,请使用 get_executor()
方法返回的对象。