如何确保使用dask和dask-cudf在“工作区”中均匀分配数量?

时间:2019-10-04 18:33:02

标签: dask cudf

我正在尝试使用dask-cudf在大量工作人员上对跨工作人员的大型文件执行基本的 ETL 工作流程。

问题:

最初,scheduler计划在工作人员之间读取相等数量的partitions,但是在预处理过程中,它倾向于在工作人员之间分发/随机排列它们。

工作人员获得的最小分区数为4,工作人员获得的最大分区数为19total partitions = apprx. 300num_workers = 22)此行为在下游引起问题,因为我希望在工作人员之间平均分配分区。

有没有办法防止这种行为?

我认为以下内容将对此有所帮助,但没有帮助。

# limit work-stealing as much as possible
dask.config.set({'distributed.scheduler.work-stealing': False})
dask.config.set({'distributed.scheduler.bandwidth': 1})

工作流程已完成:

  • 阅读
  • fill-na
  • 向下广播/其他逻辑

df = dask_cudf.read_csv(path = `big_files`,
                        names = names,
                        delimiter='\t',
                        dtype = read_dtype_ls,
                        chunksize=chunksize)


df = df.map_partitions(lambda df:df.fillna(-1))

def transform_col_int64_to_int32(df, columns):
    """
        This function casts int64s columns to int32s 
        we are using this to transform int64s to int32s and overflows seem to be consitent
    """
    for col in columns:
        df[col] = df[col].astype(np.int32)
    return df

df = df.map_partitions(transform_col_int64_to_int32,cat_col_names)
df = df.persist()

1 个答案:

答案 0 :(得分:1)

基于许多因素来调度任务运行的时间,这些因素包括数据依赖性,运行时,内存使用等。通常,这些问题的答案是“只要让它做就可以了”。排程不良的最常见原因是块太少。

但是,如果您明确需要更均衡的分配,则可以尝试Client.rebalance方法。

wait(df)
client.rebalance(df)

但是请注意,重新平衡不如其他Dask操作强大。最好在没有大量其他工作正在进行时执行此操作(因此,上面对dask.distributed.wait的调用)。

此外,我将打开工作偷窃功能。窃取工作是负载平衡的另一个名称。