DASK-在执行过程中停止工作会导致两次启动已完成的任务
我想使用dask处理大约5000个批处理任务,这些任务将结果存储在关系数据库中,在它们全部完成后,我想运行一个最终任务,该任务将查询数据库并生成一个结果文件(将存储在AWS S3中) 所以大致是这样的:DASK-在执行过程中停止工作会导致两次启动已完成的任务,dask,Dask,我想使用dask处理大约5000个批处理任务,这些任务将结果存储在关系数据库中,在它们全部完成后,我想运行一个最终任务,该任务将查询数据库并生成一个结果文件(将存储在AWS S3中) 所以大致是这样的: 从dask进口袋,延迟 批次=行李。从\u序列(我的\u批次()) 结果=batches.map(处理\u批处理\u和存储\u结果\u在\u数据库中) 图形=延迟(读取\u数据库\u和\u存储\u结果\u捆绑到\u s3中)(结果) client=client(_调度程序:8786') cli
从dask进口袋,延迟
批次=行李。从\u序列(我的\u批次())
结果=batches.map(处理\u批处理\u和存储\u结果\u在\u数据库中)
图形=延迟(读取\u数据库\u和\u存储\u结果\u捆绑到\u s3中)(结果)
client=client(_调度程序:8786')
client.compute(图形)
这是可行的,但是:在处理快结束时,许多工作人员处于空闲状态,我希望能够关闭它们(并在AWS EC2上节省一些钱),但是如果我这样做,调度程序将“忘记”这些任务已经完成,并尝试在剩余的工作人员上再次运行它们
我知道这实际上是一个功能,而不是一个bug,因为Dask试图在启动
读取\u数据库\u和\u存储\u捆绑\u结果\u到\u s3之前跟踪所有结果,但是:有什么方法可以让dask只编排分布式处理图,而不必担心状态管理吗?我建议您在完成后就忘记未来。此解决方案使用dask.distributed concurrent.futures接口,而不是dask.bag。特别是它使用迭代器
from dask.distributed import Client, as_completed
client = Client('the_scheduler:8786')
futures = client.map(process_batch_and_store_results_in_database, my_batches())
seq = as_completed(futures)
del futures # now only reference to the futures is within seq
for future in seq:
pass # let future be garbage collected
这个问题似乎与此有关:也与此有关: