直接从敏捷工作者写输出

时间:2019-03-27 12:58:21

标签: python dask

我有一个转换(映射)数据框的管道。输出很大-输入数据帧中的行包含二进制格式的音频,而输出数据帧中的行包含提取的二进制特征。

我正在从分区的实木复合地板文件读取输入,并将其写回到不同的实木复合地板文件-两者都在网络共享上。

据我了解,在分布式dask中,每个工作人员会将输出发送回调度程序(然后可能是调度程序将其发送回客户端???),然后调度程序(或客户端)才将其写入到网络共享。这是正确的吗?

如果是,如果数据很大且带宽问题,那么在这种情况下似乎存在冗余通信-为什么工人不能将输出直接发送到最终目的地(在这种情况下为网络共享)?当然,该共享必须对所有工作人员都可用,并且某人需要同步写入,但这不是dask的魔力所在吗?

1 个答案:

答案 0 :(得分:1)

您的理解是不正确的:工作人员将直接读写共享存储或云/网络服务,这是计算事物的正常方法。

df = dd.read_parquet(url)
df_out = do_work(df)
df_out.to_parquet(url2)

在这种情况下,调度程序或客户端永远不会看到数据。但是,他们进行通信:客户端将加载有关数据集的元数据,以便可以推断出如何拆分要完成的工作,并且调度程序会与客户端和工作人员进行对话找出这些任务规范并检查它们何时完成。

您可以选择使用

将整个数据集作为熊猫数据框带入客户端的内存中。
local_df = df.compute()

但是这是可选的,并且在数据大小大于内存的情况下显然不建议这样做。通常,您永远不需要为整个数据集执行此操作,而只需要为某些聚合结果比原始数据小得多即可。即使在这种情况下,调度程序本身也不会存储结果。