Можно ли записать вывод результата программы Spark в узел драйвера, когда он обрабатывается в кластере?

df = sqlContext("hdfs://....")
result = df.groupby('abc','cde').count()
result.write.save("hdfs:...resultfile.parquet", format="parquet")  # this works fine

result = result.collect()

with open("<my drivernode local directory>//textfile") as myfile:
    myfile.write(result)    # I'll convert to python object before writing

Может ли кто-нибудь дать представление о том, как ссылаться на локальную файловую систему, где я указал spark-submit?

1
PKM15 23 Дек 2015 в 11:41

2 ответа

Лучший ответ

tl; dr Используйте . (точка), и текущий рабочий каталог определяется API.

3
Jacek Laskowski 25 Дек 2015 в 17:41

Насколько я понимаю из вашего вопроса, вы спрашиваете о сохранении локальных файлов в драйвере или рабочих процессах при запуске Spark.

Это возможно и довольно просто.

Дело в том, что в конечном итоге драйвер и рабочие процессы запускают python, поэтому вы можете использовать python «open», «with», «write» и так далее.

Чтобы сделать это в рабочих процессах, вам нужно запустить foreach или map на вашем rdd, а затем сохранить локально (это может быть сложно, поскольку у вас может быть более одного раздела для каждого исполнителя).

Сохранение из драйвера еще проще, после того, как вы собрали данные, у вас есть обычный объект python, и вы можете сохранить его любым питоническим способом.

НО

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

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

Например, я использую эту технику для вставки результатов вычислений в MySQL без необходимости сбора. Я сохраняю результаты локально на воркерах как часть операции «map», а затем загружаю их с помощью MySQL «LOAD DATA LOCAL INFILE».

0
user3689574 25 Дек 2015 в 13:46