Как гарантировать, что все работники Spark были остановлены? - PullRequest
0 голосов
/ 14 мая 2018

Моя цель - собрать все данные от каждого работника Spark в один файл.

Я прочитал статью с решением для аналогичной проблемы, где автору предлагается использовать org.apache.hadoop.fs.FileUtil#copyMerge метод для таких целей.Я решил реализовать его в своем проекте, и вот что у меня есть:

 try (JavaSparkContext sparkCtx = new JavaSparkContext(sparkConf)) {
     // reading, transforming and storing RDDs to the text files
     FileUtil.copyMerge(...) // merge them altogether into the single file
 } // 'try-with-resources' eventually closes spark context

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

Я понял, что мне нужно найти какое-то место / метод, чтобы гарантировать, что все работники остановили свои исполнения и где я могу начать сбор данных.

Как этого можно достичь?Я предполагаю, что запустить накопление данных после блока try-with-resources, это правильно?

1 Ответ

0 голосов
/ 14 мая 2018

FileUtil полностью независим от Spark и не использует работников или исполнителей Spark.

Если вы хотите убедиться, что оно выполнено после завершения работы приложения Spark, вы можете вызвать его сразу после остановки контекста.

sparkCtx.stop();
FileUtil.copyMerge(...)
...