Запись выходных данных непосредственно из dask worker

#python #dask

#python #dask

Вопрос:

У меня есть конвейер, который преобразует (отображает) фрейм данных. Выходные данные большие — строки во входном фрейме данных содержат аудио в двоичном формате, а строки в выходном фрейме данных содержат извлеченные двоичные объекты.

Я считываю входные данные из разделенного файла parquet и записываю их обратно в другой файл (ы) parquet — оба в общей сетевой папке.

Насколько я понимаю, в распределенном dask каждый рабочий отправит выходные данные обратно планировщику (а затем, возможно, планировщик отправит их обратно клиенту ??) и только тогда планировщик (или клиент) запишет их в общий сетевой ресурс. Правильно ли это?

Если да, если данные большие и пропускная способность является проблемой, кажется, что в этом сценарии избыточная связь — почему рабочие не могут отправлять выходные данные непосредственно конечному получателю (сетевой ресурс в данном случае)? Конечно, общий ресурс должен быть доступен для всех рабочих, и кто-то должен синхронизировать записи, но разве не в этом заключается магия dask?

Ответ №1:

Ваше понимание неверно: рабочие будут напрямую считывать и записывать данные в общее хранилище или облачные / сетевые службы, это обычный способ расчета.

 df = dd.read_parquet(url)
df_out = do_work(df)
df_out.to_parquet(url2)
  

В этом случае данные никогда не просматриваются планировщиком или клиентом. Тем не менее, они взаимодействуют: клиент загружает метаданные о наборе данных, чтобы он мог делать выводы о том, как разделить работу, которую необходимо выполнить, а планировщик общается как с клиентом, так и с рабочими, чтобы обработать эти спецификации задачи и проверить, когда они будут выполнены.

При желании вы можете перенести весь набор данных в память клиента в виде фрейма данных pandas с

 local_df = df.compute()
  

но это необязательно и, очевидно, не рекомендуется, когда размер данных превышает объем памяти. Обычно вам никогда не нужно делать это для всего набора данных, только, возможно, для некоторого совокупного результата, намного меньшего, чем исходный. Даже в этом случае сам планировщик не сохраняет результаты.

Комментарии:

1. Спасибо @mdurant! Это то, чего я ожидал, но не смог найти явную документацию, в которой это указано. Кроме того, как dask решает, может ли рабочий писать напрямую? то есть, если я сохраню в локальный файл, где будет находиться файл?

2. Если вы укажете локальный путь, фрагмент будет находиться в файловой системе рабочего. Вы захотите выполнить запись в общий сетевой ресурс или облачное хранилище — это также способ получить параллельную пропускную способность.