如何防止dask客户端死于工作者异常?

时间:2018-12-22 04:00:02

标签: dask-distributed

我不了解dask分布式中的弹性模型。

问题

工人提出的异常情况使令人尴尬的并行dask操作失败。如果任何工人遇到异常,所有工人和客户都会死亡。

预期行为

在这里阅读:http://distributed.dask.org/en/latest/resilience.html#user-code-failures 建议应将异常包含在工作人员中,并且后续任务将继续进行而不会中断。

  

“当函数引发错误时,该错误将保留并应要求传输给客户端。任何试图收集该结果或任何相关结果的尝试都会引发该异常...这不会影响调度程序或工人。”

我在这里遵循令人尴尬的并行用例: http://docs.dask.org/en/latest/use-cases.html

可复制的示例

import numpy as np
np.random.seed(0)

from dask import compute, delayed
from dask.distributed import Client, LocalCluster

def raise_exception(x):
    if x == 10:
        raise ValueError("I'm an error on a worker")
    elif x == 20:
        print("I've made it to 20")
    else:
        return(x)


if __name__=="__main__":

    #Create cluster
    cluster = LocalCluster(n_workers=2,threads_per_worker=1)
    client = Client(cluster)

    values = [delayed(raise_exception)(x) for x in range(0,100)]
    results=compute(*values,scheduler='distributed')

任务20从未完成。任务10上的异常导致调度程序和工作程序死亡。我对编程模型不了解什么?为什么将此视为聚会?我只想运行每个任务并捕获任何异常以供以后检查,而不是在客户端上引发它们。

用例

大学SLURM集群上的并行图像处理。我的函数有一个副作用,将处理后的图像保存到文件中。进程是独立的,调度程序从不收集。该异常会导致所有节点在群集上死亡。

交叉列出问题,因为我不确定这是错误还是功能!

https://github.com/dask/distributed/issues/2436

1 个答案:

答案 0 :(得分:0)

在回购中得到了解答-延迟的延迟会计算全部或全部。从并发期货界面中使用快捷地图+等待。这是设计好的,不是错误。

https://github.com/dask/distributed/issues/2436