Dask不会清理Docker容器中的上下文

时间:2019-11-14 20:41:37

标签: docker dask dask-distributed

我们有一个Dask管道,其中我们基本上使用LocalCluster作为进程池。即我们使用LocalCluster(processes=True, threads_per_worker=1)启动集群。像这样:

dask_cluster = LocalCluster(processes=True, threads_per_worker=1)
    with Client(dask_cluster) as dask_client:
        exit_code = run_processing(input_file, dask_client, db_state).value

在本地运行时,我们的工作流和任务并行化效果很好。但是,当我们将代码复制到Docker容器(基于centos)时,处理完成,并且有时 在容器退出时会出现以下错误:

Traceback (most recent call last):^M
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/multiprocessing/queues.py", line 240, in _feed^M
    send_bytes(obj)^M
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/multiprocessing/connection.py", line 200, in send_bytes^M
    self._send_bytes(m[offset:offset + size])^M
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/multiprocessing/connection.py", line 404, in _send_bytes^M
    self._send(header + buf)^M
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/multiprocessing/connection.py", line 368, in _send^M
    n = write(self._handle, buf)^M
BrokenPipeError: [Errno 32] Broken pipe^M

此外,我们得到了该错误的多个实例,这使我认为该错误来自废弃的工作进程。我们目前的工作原理是,这与"Docker zombie reaping problem"有某种联系,但我们不知道如何从不完全不同的Docker映像开始就进行修复,我们也不想这样做。

是否有一种仅使用Dask群集/客户端清理方法来解决此问题的方法?

1 个答案:

答案 0 :(得分:1)

您应该将集群创建为上下文管理器。实际上是启动进程的东西,而不是客户端。

with LocalCluster(...):
    ...