我的目标是将来自每个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块之后运行此数据累积,对吗?

最佳答案

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

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

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

08-16 03:18