我的目标是将每个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
阻止之后运行此数据累积,这是正确的吗?
答案 0 :(得分:1)
FileUtil
完全独立于Spark,并且不使用Spark工作者或执行者。
如果您想确保在Spark应用程序完成后执行它,您可以在停止上下文后立即调用它。
sparkCtx.stop();
FileUtil.copyMerge(...)