对于长时间运行的任务,建议使用dask-kubernetes配置替代吗?

时间:2020-01-29 16:00:25

标签: python dask dask-distributed dask-kubernetes

我正在按照文档中提供的示例使用某些东西

import dask.bag
from dask_kubernetes import KubeCluster


cluster = KubeCluster.from_yaml('worker-spec.yml')
cluster.adapt(minimum=0, maximum=24, interval="20000ms")
dag = dask.bag.from_sequence(tasks).map(lambda x: make_task(x).execute())

with distributed.Client(dask_cluster) as client:
    results = dag.compute(scheduler=client)

cluster.close()

就我而言,execute()函数执行大量的IO操作,大约需要5-10分钟才能运行。我想以某种方式配置KubeCluster和快速调度程序,以使这些长时间运行的任务顺利进行的机会最大化。

我的问题分为两个部分。首先,如何覆盖distributed配置设置?我想尝试类似

dask.config.set({'scheduler.work-stealing': False})

但是我不知道在哪里设置这个正确的位置。具体来说,我不知道这是每个工作人员都应该意识到的事情,还是只有在实例化KubeCluster的时候才可以避免的事情。

我的问题的第二部分与对长时间运行(超过几分钟)的任务的建议有关。我一直在尝试使用默认设置。有时一切正常,有时compute()调用由于以下异常而失败:

  <... omitting caller from the traceback ...>
  File "/usr/local/lib/python3.7/site-packages/dask/base.py", line 436, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/distributed/client.py", line 2587, in get
    results = self.gather(packed, asynchronous=asynchronous, direct=direct)
  File "/usr/local/lib/python3.7/site-packages/distributed/client.py", line 1885, in gather
    asynchronous=asynchronous,
  File "/usr/local/lib/python3.7/site-packages/distributed/client.py", line 767, in sync
    self.loop, func, *args, callback_timeout=callback_timeout, **kwargs
  File "/usr/local/lib/python3.7/site-packages/distributed/utils.py", line 345, in sync
    raise exc.with_traceback(tb)
  File "/usr/local/lib/python3.7/site-packages/distributed/utils.py", line 329, in f
    result[0] = yield future
  File "/usr/local/lib/python3.7/site-packages/tornado/gen.py", line 735, in run
    value = future.result()
  File "/usr/local/lib/python3.7/site-packages/distributed/client.py", line 1741, in _gather
    raise exception.with_traceback(traceback)
distributed.scheduler.KilledWorker: ("('lambda-364defe33868bf6e4864da2933065a12', 3)", <Worker 'tcp://172.18.7.71:39029', name: 9, memory: 0, processing: 4>)

我正在从master分支dask-kubernetes@git+git://github.com/dask/dask-kubernetes.git@add93d56ba1ac2f7d00576bd3f2d1be0db3e1757运行最近的提交。

编辑:

我更新了代码段,以显示我正在调用adapt()函数,并将最小数量的worker设置为0。我开始怀疑,如果数量为0,worker是否会导致调度程序在返回{ {1}}个结果。

1 个答案:

答案 0 :(得分:0)

首先,如何覆盖分布式配置设置?

您可以通过设置configuration YAML files来修改environment variables来覆盖设置。

因此,根据您的情况,您可以更新public void loadInformation() { Request request = null; try { //File requestsFile = new File("requests.bin"); FileInputStream fileIn = new FileInputStream("requests.bin"); ObjectInputStream in = new ObjectInputStream(fileIn); boolean flag = true; while (flag) { /* if (in.read()==-1){ flag = false; break; }*/ System.out.println("start reading "); request = (Request) in.readObject(); System.out.println("end of reading "); if (request == null) flag = false; else requests.add(request); } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (EOFException e) { System.out.println("READING IS DONE ."); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } } } 文件。

~/.config/dask/distributed.yaml

或通过设置环境变量。

distributed:
  scheduler:
    work-stealing: false

有时候一切都会顺利进行,有时compute()调用会因以下异常而失败...

export DASK_DISTRIBUTED__SCHEDULER__WORK_STEALING=False 异常的发生有多种原因。我们包括了a documentation page关于常见情况的信息。

我最经常发现的原因是该任务使用了比可用内存更多的内存,并且被OOM杀手杀死。