dask 数据帧处理速度是否随工作人员数量线性增加?

时间:2021-04-30 09:17:01

标签: dask dask-distributed dask-dataframe

嗨,我是 dask 数据框的新手,正在研究它如何通过分布式计算来改善处理时间。我的代码正在使用 5m+ 行文件,如下所示

client = Client('127.0.0.1:8786')

start_time = time.time()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time)))

ddf = dask.dataframe.read_csv(filename)
ddf = ddf[['Prod_desc']].drop_duplicates()
ddf = ddf.query(filter_text)

df = ddf.head(1000, npartitions=-1)

end_time = time.time()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time)))
print(end_time - start_time, 'secs')

结果如下

分布式1个服务器,1个worker/server 22.344669342041016 秒

分布式2个服务器,1个worker/server 11.367061614990234 秒

分布式3台服务器,1台worker/server 9.111485004425049 秒

分布式3个服务器,2个worker/server 6.44242000579834 秒

分布式3台服务器,3台worker/server 8.706154823303223 秒

处理速度并没有像我们预期的那样线性提高。当我们在每台服务器上使用 3 个 worker 时,使用的时间比每台服务器使用 2 个 worker 多。

有人知道这是怎么发生的吗?谢谢。

2 个答案:

答案 0 :(得分:0)

如果我正确阅读了代码,您会阅读数据,然后删除重复项,然后显示前 1000 项。 我怀疑这些步骤中的一个或两个都需要对数据进行洗牌,甚至可能需要混洗到一个地方。

如果您需要进行 shuffle,这会花费时间(节点之间的数据传输会接触服务器之间的网络和磁盘,不确定服务器内会发生什么),那么这将是我看到速度变慢的主要原因。

>

通常并行处理应该线性加速,但是如果您可以执行多个处理步骤并且改组只是一个次要组成部分,则尤其如此,在这项工作中处理非常轻,甚至可能花费更少的时间而不是简单地传输数据。

答案 1 :(得分:0)

你可以尝试删除吗

ddf = ddf[['Prod_desc']].drop_duplicates()

然后再次测试时间? 此步骤可能会删除太多行,因此下一步的行太少。