如何在所有dask worker上加载数据框

时间:2017-10-23 19:09:46

标签: python performance amazon-s3 dask dask-distributed

我在S3中有几千个CSV文件,我想加载它们,将它们连接成一个pandas数据帧,并与群集中的所有dask worker共享整个数据帧。所有文件的大小大致相同(约1MB)。我每台机器使用8个进程(每个核心一个),每个进程一个线程。整个数据框适合每个工作进程的内存。什么是实现这一目标的最有效和可扩展的方法?

我使用MPI4py实现了这个工作流,如下所示:在一个工作进程中使用一个线程池将所有文件读入pandas数据帧,将数据帧连接在一起,并使用MPI4py的广播函数将完整的数据帧发送到所有其他工作进程。

我已经想过在dask中实现这个目标的五种方法:

  1. 每个工作人员使用pandas.read_csv读取所有文件,然后使用pandas.concat将它们连接在一起。
  2. 使用dask.dataframe.from_delayed将所有文件读入分布式dask数据帧,使用dask.distributed.worker_client在每个工作进程上获取客户端,然后对每个worker使用dask.dataframe.compute来获取pandas数据帧
  3. 在解决方案2中加载分布式数据框,使用dask.distributed.Client.replicate将所有分区分发给所有工作者,使用dask.distributed.worker_client在每个工作进程上获取客户端,并使用dask .dataframe.compute在每个工作进程中获取pandas数据帧。
  4. 如解决方案2中那样加载分布式数据框,使用dask.dataframe.compute将数据框带入本地进程,从群集中删除分布式数据框(通过取消期货),并使用dask.distributed.Client。 scatter(broadcast = True,direct = True)将本地pandas数据帧发送给所有worker。
  5. 加载分布式数据帧并将其收集到本地进程,如解决方案4中所示,使用dask.distributed.Client.scatter(broadcast = False)将其发送到工作进程,使用dask.distributed.Client.replicate发送它给所有其他工人。
  6. 解决方案2-5与MPI4py版本相比具有巨大优势,因为它们利用了dask并行加载数据帧的能力。但是,当它需要在群集周围分发数据时,这些解决方案都无法与MPI4py的广播功能接近。另外,我在预测内存使用情况时遇到了麻烦,我看到很多来自工作人员的消息抱怨说事件循环在多秒内没有响应。

    在这个阶段,我倾向于使用第一个解决方案:尽管数据加载效率低,但速度并不慢,根据我的经验,它是最强大的。如果我走这条路,我肯定会在桌面上留下很多表现潜力。有没有办法改进其中一个dask解决方案?还是有其他解决方案我还没有考虑过?

0 个答案:

没有答案