如何确保“分区”的数量在具有dask和dask cudf的工作人员之间平均分布?

如何确保“分区”的数量在具有dask和dask cudf的工作人员之间平均分布?,dask,cudf,Dask,Cudf,我试图在大量工作人员中使用dask-cudf对工作人员中的大文件执行基本ETL工作流 问题: 最初,调度器计划在多个工作进程中读取等量的分区,但在预处理过程中,它倾向于在多个工作进程中分配/洗牌分区 一个worker获得的最小分区数是4,最大分区数是19(总分区数=大约300个,num_workers=22)此行为会导致下游出现问题,因为我希望分区在worker之间的分布均匀 有没有办法防止这种行为? 我原以为下面会有帮助,但事实并非如此 # limit work-stealing as muc

我试图在大量工作人员中使用
dask-cudf
对工作人员中的大文件执行基本ETL工作流

问题: 最初,
调度器
计划在多个工作进程中读取等量的
分区
,但在预处理过程中,它倾向于在多个工作进程中分配/洗牌分区

一个worker获得的最小分区数是
4
,最大分区数是
19
总分区数
=
大约300个
num_workers
=
22
)此行为会导致下游出现问题,因为我希望分区在worker之间的分布均匀

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

我原以为下面会有帮助,但事实并非如此

# limit work-stealing as much as possible
dask.config.set({'distributed.scheduler.work-stealing': False})
dask.config.set({'distributed.scheduler.bandwidth': 1})
正在完成的工作流程:

  • 阅读
  • 填充na
  • 向下投射/其他逻辑

df=dask\u cudf.read\u csv(路径=`big\u files`,
名称=名称,
分隔符='\t',
数据类型=读取数据类型,
chunksize=chunksize)
df=df.map_分区(lambda-df:df.fillna(-1))
def转换_col_int64_到_int32(df,列):
"""
此函数用于将int64s列强制转换为int32s列
我们使用它将int64s转换为int32s,溢出似乎是一致的
"""
对于列中的列:
df[col]=df[col].astype(np.int32)
返回df
df=df.map_分区(将_col_int64_转换为_int32,cat_col_名称)
df=df.persist()

Dask调度,其中任务基于多种因素运行,包括数据依赖关系、运行时、内存使用等。通常,这些问题的答案是“让它做它该做的事”。调度不佳的最常见原因是块太少

但是,如果您明确需要一个更平衡的分布,那么您可以尝试该方法

然而,请注意,再平衡并不像其他Dask操作那样稳健。最好在没有大量其他工作进行的时候进行(因此上面调用了
dask.distributed.wait


此外,我会打开工作盗窃。工作窃取是负载平衡的另一个名称。

我尝试了
重新平衡
,但它有两个问题:1。重新平衡需要相当长的一段时间(30秒以上),但最终还是会有相同数量的分区。2.如果我两次调用re balance以获得更好的平衡机会,它会给我一个错误。我们很快就会提出一个github问题。那么,下一个问题将是问为什么这些任务会按这个顺序完成。也许对某些任务有很大的依赖性,这会鼓励他们留在一台机器上?也许相对于你拥有的计算线程的数量,你只有很少的任务,所以随机机会是你的敌人?总的来说,Dask并不试图以最佳方式做事。它努力快速做出足够好的决策。
wait(df)
client.rebalance(df)