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