Как передать исходные файлы работникам Dask? - PullRequest
0 голосов
/ 07 ноября 2019

На моем узле Dask Jupyter у меня есть следующая структура файла:

main/
  src/
    subfolder/
      file1.py
      file2.py
      file3.py
  main.py

Код в main.py примерно выглядит так:

# main.py

from distributed import Client
from src.subfolder.file1 import important_function
# ...

cluster_address = os.environ.get('CLUSTER_ADDRESS', 'dask-scheduler:8786')
client = Client(cluster_address)

arg1, arg2 = ...
future = client.submit(important_function, arg1, arg2)
result = future.result()

На самом деле история сложнеетак как я создаю рабочих на основе шаблона. Но тем не менее, я думаю, что это иллюстрирует проблему. Когда я запускаю этот код, я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  ...
  File "main.py", line 151, in ...
    result = future.result()
  File "/opt/conda/lib/python3.7/site-packages/distributed/client.py", line 222, in result
    raise exc.with_traceback(tb)
  File "/opt/conda/lib/python3.7/site-packages/distributed/protocol/pickle.py", line 59, in loads
    return pickle.loads(x)
ModuleNotFoundError: No module named 'src'

Что я пробовал: я копировал все исходные папки на рабочий, когда я порождаю рабочий. Все исходные файлы попадают в /build на рабочем. Таким образом, все содержимое main в приведенном выше примере фактически находится в каталоге /build на рабочем месте. Думаю, мне нужно как-то сказать работнику, что получаемые им функции должны выполняться в /build как их рабочий каталог. Это путь? У кого-нибудь есть идеи, как это решить?

1 Ответ

0 голосов
/ 08 ноября 2019

Хорошо, я понял это. Внутри important_function() мне нужно добавить путь к sys так:

def important_function(arg1, arg2):

    sys.path.append("/build")
    # more import statements here

...