带有Dask的Streamz分布式

时间:2018-10-02 19:00:02

标签: dask dask-distributed

基于streamz documentation,人们可以通过以下方式利用简单的分布式集群:

from distributed import Client
client = Client('tcp://localhost:8786')  # Connect to scheduler that has distributed workers

from streamz import Stream
source = Stream()
(source.scatter()       # scatter local elements to cluster, creating a DaskStream
       .map(increment)  # map a function remotely
       .buffer(5)       # allow five futures to stay on the cluster at any time
       .gather()        # bring results back to local process
       .sink(write))    # call write locally

for x in range(10):
    source.emit(x)

从概念上讲,目前尚不清楚为什么我们不必将dask分布式client作为实例化Stream()的参数。更具体地说,Stream()如何知道要附加到哪个调度程序?

如果您有两个调度程序在不相关的节点上有工作线程,那么您将怎么办:

from distributed import Client
client_1 = Client('tcp://1.2.3.4:8786')
client_2 = Client('tcp://10.20.30.40:8786')

一个人如何分别为client_1client_2创建两个流?

1 个答案:

答案 0 :(得分:1)

Dask中的基本规则是,如果定义了分布式客户端,则将其用于任何Dask计算。如果有多个分布式客户端,请使用仍在运行的最新客户端。

Streamz不会明确允许您在.scatter()时选择使用哪个客户端,而是使用dask.distributed.default_client()来选择一个。您可能希望向他们提出一个问题,以允许使用client=关键字。工作流甚至不适合基于上下文的方法。现在,如果要同时使用多个streamz处理不同的Dask群集上的数据,则可能必须操纵dask.distributed.client._global_clients的状态。