我正在Spark中开发一个程序。我需要将结果放在一个文件中,因此有两种方法可以合并结果:
myRDD.coalesce(1,false).saveAsTextFile(pathOut);
hadoop fs -getmerge pathOut localPath
哪一个最有效,最快?
是否有其他方法可以合并HDFS中的文件(如“getmerge”),将结果保存到HDFS,而不是将其转换为本地路径?
答案 0 :(得分:2)
如果你确定你的数据适合内存,那么coalesce可能是最好的选择,但在其他情况下为了避免OOM错误,我会使用getMerge或者你正在使用FileUtil的Scala / Java copyMerge API函数类。
查看此用户邮件列表的thread。
答案 1 :(得分:0)
如果您正在处理大型数据集(我认为您是),我建议让Spark将每个分区写入其自己的"部分"在HDFS中文件,然后使用hadoop fs -getMerge
从HDFS目录中提取单个输出文件。
Spark将数据拆分为分区以提高效率,因此可以在多个工作节点之间分配工作负载。如果您合并到少量分区,则会降低其分配工作的能力,而只需1个分区就可以将所有工作放在单个节点上。充其量这将是更慢,最坏的情况是它会耗尽内存并使工作崩溃。