如何保证所有Spark工作人员都已停止?

时间:2018-05-14 16:11:55

标签: java apache-spark hdfs distributed-computing

我的目标是将每个Spark工作人员的所有数据累积到一个文件中。

我为一个类似问题的解决方案阅读了一些article,鼓励作者使用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 :(得分:1)

FileUtil完全独立于Spark,并且不使用Spark工作者或执行者。

如果您想确保在Spark应用程序完成后执行它,您可以在停止上下文后立即调用它。

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