Dask分布式调度器和大型功能
在Dask分布式调度器w/aDask分布式调度器和大型功能,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
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)
这将更有效率。资源是否必须成为未来?不,它不是