使用Distributed来安排许多相互依赖的任务,在谷歌计算引擎上运行。当我中途启动一个额外的工作实例时,没有任务被安排到它(尽管它与调度程序一起注册)。我认为这是因为(来自http://distributed.readthedocs.io/en/latest/scheduling-state.html#distributed.scheduler.decide_worker):
"如果任务需要数据通信,那么我们选择最小化工作人员之间发送的字节数。这优先于工人占用。"
一旦我在运行任务树中途,所有剩余的任务都取决于已经运行的任务的结果。因此,如果我正确地解释上述引用,那么无论它们多么无所事事,新工人都不会安排任何事情,因为依赖数据从来就不存在,而是始终存在于旧工作人员身上。工人。
但是,我确实要确保要传输的数据量相当小,通常只是一个小字符串。因此,在这种情况下,让闲置优先于数据通信会更有意义。是否有可能允许这样做(例如设置一个'调度程序策略&或者甚至可能有一个可以调整的数据与空闲权衡权衡系数?
评论#1后更新:
复杂因素:每个任务都使用资源框架来确保它在cpu绑定任务的工作集上运行(" CPU = 1")或者在网络工作者集上运行 - 绑定任务(" NET = 1")。这种分离是为了避免过载/下载服务器并将任务限制/下载到某个最大值,同时仍然能够扩展其他任务。但是,根据http://distributed.readthedocs.io/en/latest/work-stealing.html,在这些情况下不会发生任务窃取?有没有办法在保持资源限制的同时允许任务窃取?
更新2 :我发现有一个未解决的问题:https://github.com/dask/distributed/issues/1389。有计划实施吗?
答案 0 :(得分:0)
虽然Dask更喜欢安排减少沟通的工作,但也承认这并不总是最好的。通常,Dask在机器上运行任务,首先完成任务,同时考虑到过载工作人员的通信成本和现有任务积压。
有关负载平衡的更多信息,您可以考虑阅读此文档页面:
http://distributed.readthedocs.io/en/latest/work-stealing.html