集群dask的并行化

时间:2018-07-18 13:04:15

标签: dask dask-distributed

我正在寻找在集群上并行化以下问题的最佳方法。我有几个文件

  • folder / file001.csv
  • folder / file002.csv
  • 文件夹/file100.csv

相对于我要用来分组的public List<HRVacantionUser> listVacantionGoogleUsers(List<GoogleUser> allGoogleUsers){ LocalDate date = LocalDate.now(); List<HRVacantionUser> collect = allGoogleUsers.stream() .map(user -> new HRVacantionUser(user.getPrimaryEmail(), date, date.plusDays(ThreadLocalRandom.current().nextInt(1, 5)))) .collect(toList()); return collect; ,它们是不相交的,也就是说,如果key中有一组键,则这些键中的任何一个在任何其他文件中都有一个项。

我可以一边跑

file1.csv

但是我想知道是否存在一种更好/更智能的方式来实现 delayed-groupby方式。

每个df = dd.read_csv("folder/*") df.groupby("key").apply(f, meta=meta).compute(scheduler='processes') 都适合节点上的内存。假设每个节点都具有filexxx.csv个核心,则最好使用所有这些核心。对于每个文件,我都可以使用这种hacky方式

n

再说一次,我不确定是否有有效的方法。

1 个答案:

答案 0 :(得分:-1)

您可以使用Client(默认情况下将在多进程中运行)并使用特定的blocksize读取数据。您可以使用ncores方法获得工作人员数量(以及每个工作人员的核心数量),然后计算出最佳的blocksize

但是根据documantaion blocksize,默认情况下是“根据可用的物理内存和内核数进行计算”。

所以我认为做到这一点的最佳方法很简单:

from distributed import Client
# if you run on a single machine just do: client = Client()
client = Client('cluster_scheduler_path')
ddf = dd.read_csv("folder/*")

编辑:之后,使用map_partitions并对每个分区执行gorupby:

# Note ddf is a dask dataframe and df is a pandas dataframe 
new_ddf = ddf.map_partitions(lambda df: df.groupby("key").apply(f), meta=meta)

不要使用compute,因为它会产生一个pandas.dataframe,而是使用dask output方法来使整个过程保持并行,更大,然后与ram兼容。