【发布时间】:2020-05-26 20:10:25
【问题描述】:
我基于the dask-docker Dockerfile 创建了我自己的稍作修改的Dockerfile,它安装adlfs 并将我的一个自定义库复制到容器中,以使其可用于所有工作节点。我将容器部署到了 Kubernetes 集群,并从本地机器上的 REPL 连接到它,在本地创建了一个客户端和一个函数:
>>> def add1(n): return n + 1
...
>>> client = Client(my_ip + ':8786')
但是当我运行client.submit 时,我收到distributed.protocol.pickle“无法反序列化b'...'”错误消息或Futures 卡在“待处理”状态:
>>> 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协议错误只会在我提交第一份工作时发生一次,然后一切都卡在pending中。
来自kubectl,我看到我有:
- 一个名为
dask-scheduler的LoadBalancer服务, - 两个部署:1x
dask-scheduler和 3xdask-worker, - 以及对应的一个
dask-scheduler-...和三个dask-worker-...pod
什么会导致这种情况,我该如何调试?我打开了 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 映像(我的 K8s 清单中的image: "daskdev/dask:2.11.0"),一切正常。因此,在尝试创建自定义 Docker 映像时,Dask 似乎配置错误。我注释掉了我对Dockerfile 的更改,在我的本地和ACR 图像上运行docker rmi,拆除了我已部署的服务和部署,然后重建了一个容器,推送它并进行了部署,但它仍然失败。
【问题讨论】:
标签: python dask dask-distributed dask-kubernetes