Dask分布式调度器和大型功能

Dask分布式调度器和大型功能,dask,dask-distributed,Dask,Dask Distributed,在Dask分布式调度器w/aLocalCluster的上下文中:有人能帮助我理解拥有大型(堆)映射函数的动态性吗 例如,考虑DASK数据帧 DDF和 MAPX分区< /代码>操作: def mapper(): resource=... #load some large resource eg 50MB def inner(pdf): return pdf.apply(lambda x: ..., axis=1) return inner mapper_fn = mapp

在Dask分布式调度器w/a
LocalCluster
的上下文中:有人能帮助我理解拥有大型(堆)映射函数的动态性吗

例如,考虑DASK数据帧<代码> DDF和<代码> MAPX分区< /代码>操作:

def mapper():
  resource=... #load some large resource eg 50MB

  def inner(pdf):
    return pdf.apply(lambda x: ..., axis=1)

  return inner

mapper_fn = mapper() #50MB on heap
ddf.map_partitions(mapper_fn)
这里发生了什么?Dask将序列化映射程序并发送到所有任务?比如说,我有
n
分区,所以,
n
任务


根据经验,我观察到,如果我有40个任务和一个50MB的映射器,那么需要大约70秒的时间才能开始工作,集群似乎坐在那里,CPU满了,但仪表板上什么也没有显示。这里发生了什么?在dish分布式调度程序中使用大型(堆)函数会产生什么后果

Dask使用cloudpickle序列化非平凡函数,并在每个任务中包含这些函数的序列化版本。这是非常低效的。我们建议您不要这样做,而是显式地传递数据

resource = ...

ddf.map_partitions(func, resource=resource)

这将更有效率。

资源是否必须成为未来?不,它不是