我正在使用Dask分布式调度程序,在本地运行一个调度程序和5个工作人员。我向delayed()
提交了一个compute()
任务列表。
当任务数为20 (一个数字>>比工作人员数)并且每个任务至少需要15秒时,调度程序将开始重新运行某些任务(或多次并行执行任务)。
这是一个问题,因为任务修改了SQL,如果它们再次运行,最终会引发异常(由于db唯一性约束)。我不会在任何地方设置pure=True
(我相信默认设置是False
)。除此之外,Dask图是微不足道的(任务之间没有依赖关系)。
仍然不确定这是一个功能,还是一个错误在达克。我有种直觉觉得这可能和工人偷窃有关..。
发布于 2017-01-31 11:19:23
正确,如果一个任务被分配给一个工人,而另一个工作人员获得了自由,它可能会选择从它的同事那里窃取多余的任务。它有可能窃取刚刚开始运行的任务,在这种情况下,该任务将运行两次。
处理此问题的干净方法是确保任务是幂等的,即使运行两次,它们也返回相同的结果。这可能意味着在任务中处理数据库错误。
对于数据密集型计算工作负载来说,这是一种很好的策略,但对于数据工程工作负载则是非常糟糕的。设计一个同时满足这两个需求的系统是很棘手的。
https://stackoverflow.com/questions/41965253
复制相似问题