由于某些群集规则,可能会因为某个原因而导致进程被终止(例如,在另一组用户具有高优先级的节点中分配)
是否有办法让该工作人员获得“失去的”任务或数据集。标记,以便Dask / Distributed系统重新运行该特定任务以及它的依赖图?
答案 0 :(得分:0)
目前无法重试失败的任务。这是一个合理的要求,所以我打开了Github issue here。此问题的未来读者可能希望检查该问题的状态,以查看事情是否已发生变化。
同时,您可以更改一个避免KilledWorker
问题的参数。仅当一个任务在三名工作人员意外死亡时正在运行时,才会发生KilledWorker
异常。这意味着当糟糕的工作人员从失败的工作人员转移到失败的工作人员时,可以阻止不良任务灾难性地拆除整个集群。如果您的群集真的有点不稳定,那么您可能希望将此参数三增加到更大的数字,如二十。您应该更改承载调度程序的计算机上的~/.dask/config
文件,以包含以下值:
allowed-failures: 20
目前在dask / distributed master中,您还可以使用环境变量DASK_ALLOWED_FAILURES=20
进行分配。这应该在1.15.2之后的版本中提供。
答案 1 :(得分:0)
似乎我找到了问题的根源:
如果我没错,dask / distributed使用__sizeof__
属性来规划工作中对象的部署。
如果确实如此,则__sizeof__
的规范说明
"只考虑直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。" (https://docs.python.org/3/library/sys.html#sys.getsizeof)分布式可能低估了对象的大小,例如稀疏矩阵或第三方类,它们可能包含发送给工作者的数组或其他大型对象,并使我的集群调度程序(例如Torque)杀死工作者
也许正确的解决方法是建议添加一个特定于dask的方法来计算大小而不是依赖于sys.getsizeof?