Что заставляет фьючерсы Dask зависать в состоянии ожидания? - PullRequest
0 голосов
/ 26 мая 2020

Я создал свой собственный, очень немного измененный Dockerfile на основе dask-docker Dockerfile, который устанавливает adlfs и копирует одну из моих пользовательских библиотек в контейнер, чтобы сделать ее доступной для все рабочие узлы. Я развернул свой контейнер в своем кластере Kubernetes и подключился к нему через REPL на моем локальном компьютере, создав клиент и функцию локально:

>>> def add1(n): return n + 1
...
>>> client = Client(my_ip + ':8786')

Но когда я запускаю client.submit, я получаю либо distributed.protocol.pickle сообщения об ошибках «Не удалось десериализовать b '...'», либо фьючерсы застряли в состоянии «ожидания»:

>>> 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>

Кажется, что ошибка протокола рассола произойдет только один раз, когда я отправлю первое задание, потом все просто застряло в pending.

Из kubectl я вижу, что у меня есть:

  • одна LoadBalancer служба с именем dask-scheduler,
  • два развертывания: 1x dask-scheduler и 3x dask-worker,
  • и соответствующий dask-scheduler-... и три dask-worker-... pod

Что может вызвать это, и как я могу отладить? Я открыл веб-интерфейс для своего планировщика Dask, и он показывает, что у меня есть экземпляр 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

Edit : отмечу, что если я разверну образ Dask (image: "daskdev/dask:2.11.0" в моем манифесте K8s), все будет работать нормально. Итак, при попытке создать индивидуальный образ Docker, что-то, кажется, неправильно настроено с помощью Dask. Я закомментировал свои изменения в Dockerfile, запустил docker rmi на моем локальном образе и ACR , разорвал развернутую службу и развертывания, затем перестроил контейнер, подтолкнул его и выполнил развертывание, но это по-прежнему не удается.

1 Ответ

0 голосов
/ 27 мая 2020

Похоже, проблема заключается в различии между успешно развернутым мной образом Dask и Dockerfile, на основе которого я создавал свой собственный образ. Первый (2.11.0), запекается в Dask 2.11.0 , а второй запекает как в Dask 2.16.0, так и в Python 3.8 . Некоторая разница в этих версиях вызывает проблему.

Когда я обновляю свой Dockerfile для использования 2.11.0 и удаляю явную зависимость Python, все работает нормально.

...