我正在尝试使用dask-cudf
在大量工作人员上对跨工作人员的大型文件执行基本的 ETL 工作流程。
最初,scheduler
计划在工作人员之间读取相等数量的partitions
,但是在预处理过程中,它倾向于在工作人员之间分发/随机排列它们。
工作人员获得的最小分区数为4
,工作人员获得的最大分区数为19
(total partitions
= apprx. 300
,num_workers
= 22
)此行为在下游引起问题,因为我希望在工作人员之间平均分配分区。
有没有办法防止这种行为?
我认为以下内容将对此有所帮助,但没有帮助。
# limit work-stealing as much as possible
dask.config.set({'distributed.scheduler.work-stealing': False})
dask.config.set({'distributed.scheduler.bandwidth': 1})
工作流程已完成:
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()
答案 0 :(得分:1)
基于许多因素来调度任务运行的时间,这些因素包括数据依赖性,运行时,内存使用等。通常,这些问题的答案是“只要让它做就可以了”。排程不良的最常见原因是块太少。
但是,如果您明确需要更均衡的分配,则可以尝试Client.rebalance方法。
wait(df)
client.rebalance(df)
但是请注意,重新平衡不如其他Dask操作强大。最好在没有大量其他工作正在进行时执行此操作(因此,上面对dask.distributed.wait
的调用)。
此外,我将打开工作偷窃功能。窃取工作是负载平衡的另一个名称。