是什么导致 Dask 期货陷入 'pending' 状态?
What causes Dask futures to get stuck in 'pending' state?
我根据 the dask-docker
Dockerfile
创建了我自己的 Dockerfile
并稍作修改,安装 adlfs
并将我的自定义库之一复制到容器中,以便所有工作人员都可以使用它节点。我将我的容器部署到我的 Kubernetes 集群,并从我本地机器上的 REPL 连接到它,在本地创建一个客户端和一个函数:
>>> def add1(n): return n + 1
...
>>> client = Client(my_ip + ':8786')
但是当我 运行 client.submit
时,我收到 distributed.protocol.pickle
"Failed to deserialize b'...'" 错误消息或 Futures 卡在 'pending' 状态:
>>> f = client.submit(add1, 2)
>>> distributed.protocol.pickle - INFO - Failed to deserialize b'\x80\x05\x95\xba\x03\x00\x00\x00\x00\x00\x00\x8c\x16tblib.pickling_support...'
...
ValueError: unsupported pickle protocol: 5
>>>
>>> f = client.submit(add1, 2)
>>> f
<Future: pending, key: add1-d5d2ff94399d4bb4e41150868f4c6da7>
pickle protocol error好像只会在我提交第一个作业的时候出现一次,之后就卡在了pending
.
来自 kubectl
,我看到我有:
- 一个名为
dask-scheduler
、 的 LoadBalancer
服务
- 两次部署:1x
dask-scheduler
和 3x dask-worker
,
- 和对应的一个
dask-scheduler-...
和三个dask-worker-...
pods
什么会导致这种情况,我该如何调试?我打开了我的 Dask 调度程序的 Web 界面,它显示我有一个 add1
的实例出错了,但它没有提供任何细节。
就其价值而言,我对 Dockerfile
所做的唯一更改是:
# ...
&& find /opt/conda/lib/python*/site-packages/bokeh/server/static -type f,l -name '*.js' -not -name '*.min.js' -delete \
&& rm -rf /opt/conda/pkgs
RUN pip install adlfs==0.3.0 # new line
COPY prepare.sh /usr/bin/prepare.sh # existing line
COPY foobar.sh /usr/bin/foobar.sh # new line
COPY my_file.so /usr/bin/my_file.so # new line
编辑:我会注意到,如果我部署 Dask 映像(image: "daskdev/dask:2.11.0"
在我的 K8s 清单中),一切正常。因此,在尝试创建自定义 Docker 图像时,Dask 似乎配置错误。我在我的本地和 ACR 图像上注释掉了我对 Dockerfile
、运行 docker rmi
的更改,拆除了我部署的服务和部署,然后重建了一个容器,推送它,并进行了部署,但仍然失败。
看起来问题在于我成功部署的 Dask 映像与我在其上创建自己的映像的 Dockerfile
之间的区别。前者(2.11.0),bakes in Dask 2.11.0 while the latter bakes in both Dask 2.16.0 and Python 3.8。这些版本中的一些差异导致了这个问题。
当我更新 Dockerfile
以使用 2.11.0 并删除显式 Python 依赖项时,一切正常。
我根据 the dask-docker
Dockerfile
创建了我自己的 Dockerfile
并稍作修改,安装 adlfs
并将我的自定义库之一复制到容器中,以便所有工作人员都可以使用它节点。我将我的容器部署到我的 Kubernetes 集群,并从我本地机器上的 REPL 连接到它,在本地创建一个客户端和一个函数:
>>> def add1(n): return n + 1
...
>>> client = Client(my_ip + ':8786')
但是当我 运行 client.submit
时,我收到 distributed.protocol.pickle
"Failed to deserialize b'...'" 错误消息或 Futures 卡在 'pending' 状态:
>>> f = client.submit(add1, 2)
>>> distributed.protocol.pickle - INFO - Failed to deserialize b'\x80\x05\x95\xba\x03\x00\x00\x00\x00\x00\x00\x8c\x16tblib.pickling_support...'
...
ValueError: unsupported pickle protocol: 5
>>>
>>> f = client.submit(add1, 2)
>>> f
<Future: pending, key: add1-d5d2ff94399d4bb4e41150868f4c6da7>
pickle protocol error好像只会在我提交第一个作业的时候出现一次,之后就卡在了pending
.
来自 kubectl
,我看到我有:
- 一个名为
dask-scheduler
、 的 - 两次部署:1x
dask-scheduler
和 3xdask-worker
, - 和对应的一个
dask-scheduler-...
和三个dask-worker-...
pods
LoadBalancer
服务
什么会导致这种情况,我该如何调试?我打开了我的 Dask 调度程序的 Web 界面,它显示我有一个 add1
的实例出错了,但它没有提供任何细节。
就其价值而言,我对 Dockerfile
所做的唯一更改是:
# ...
&& find /opt/conda/lib/python*/site-packages/bokeh/server/static -type f,l -name '*.js' -not -name '*.min.js' -delete \
&& rm -rf /opt/conda/pkgs
RUN pip install adlfs==0.3.0 # new line
COPY prepare.sh /usr/bin/prepare.sh # existing line
COPY foobar.sh /usr/bin/foobar.sh # new line
COPY my_file.so /usr/bin/my_file.so # new line
编辑:我会注意到,如果我部署 Dask 映像(image: "daskdev/dask:2.11.0"
在我的 K8s 清单中),一切正常。因此,在尝试创建自定义 Docker 图像时,Dask 似乎配置错误。我在我的本地和 ACR 图像上注释掉了我对 Dockerfile
、运行 docker rmi
的更改,拆除了我部署的服务和部署,然后重建了一个容器,推送它,并进行了部署,但仍然失败。
看起来问题在于我成功部署的 Dask 映像与我在其上创建自己的映像的 Dockerfile
之间的区别。前者(2.11.0),bakes in Dask 2.11.0 while the latter bakes in both Dask 2.16.0 and Python 3.8。这些版本中的一些差异导致了这个问题。
当我更新 Dockerfile
以使用 2.11.0 并删除显式 Python 依赖项时,一切正常。