Dask用期货计算子图

时间:2017-07-26 04:11:37

标签: python-3.x dask concurrent.futures dask-distributed

我想提交一个执行以下操作的dask任务:

  1. 使用dask.bag(def fakejob
  2. 构建一个懒惰的dask图
  3. 从1开始计算图表并将其保存到镶木地板(将此部分留下,只是一个动机)
  4. 我需要为多个输入执行此操作,因此我一直在尝试使用dask.distributed的期货功能。

    from dask.distributed import Client
    
    client = Client(processes=True)
    
    def fakejob(path):
        return (
            dask.bag
            .read_text(path)
            .to_dataframe()
        )
    
    futures = client.map(fakejob, [input_path1, input_path2])
    

    我遇到的问题是:AssertionError: daemonic processes are not allowed to have children

    我尝试过关注this link并最终获得了第二个版本(与第一个版本相差1行),但期货永远保持“待定”状态。

    from dask.distributed import Client
    
    client = Client(processes=True)
    
    def fakejob(path):
        with dask.set_options(get=client.get):
            return (
                dask.bag
                .read_text(path)
                .to_dataframe()
            )
    
    futures = client.map(fakejob, [input_path1, input_path2])
    

    有关如何执行此操作的任何线索?

    干杯。

1 个答案:

答案 0 :(得分:2)

在工作进程中尝试构造dask图(这就是一个包),这是一个奇怪的,稍微有点笨拙的错误消息,如果用client.map调用,那么事情就会结束。如果您可以将整个工作流程放在函数中,包括写入镶木地板,并且没有尝试将包传回给调用者,那么您的第二次尝试将与本地客户端一起使用。

解决方案更简单。

bags = [dask.bag.read_text(path)
        .to_dataframe() for path in [input_path1, input_path2])
futures = client.compute(bags)   # run in background on the cluster
client.gather(futures)   # wait and get results

这里,bags是一个dask-bag列表,即已定义但尚未运行的工作任务。您可以使用dask.compute(*bags)替换最后两行以获得结果而不必担心未来。