Spark合并vs HDFS getmerge

时间:2015-11-11 08:50:30

标签: hadoop apache-spark hdfs coalesce

我正在Spark中开发一个程序。我需要将结果放在一个文件中,因此有两种方法可以合并结果:

  • Coalesce(Spark):
  

myRDD.coalesce(1,false).saveAsTextFile(pathOut);

  • 之后在HDFS中合并:
  

hadoop fs -getmerge pathOut localPath

哪一个最有效,最快?

是否有其他方法可以合并HDFS中的文件(如“getmerge”),将结果保存到HDFS,而不是将其转换为本地路径?

2 个答案:

答案 0 :(得分:2)

如果你确定你的数据适合内存,那么coalesce可能是最好的选择,但在其他情况下为了避免OOM错误,我会使用getMerge或者你正在使用FileUtil的Scala / Java copyMerge API函数类。

查看此用户邮件列表的thread

答案 1 :(得分:0)

如果您正在处理大型数据集(我认为您是),我建议让Spark将每个分区写入其自己的"部分"在HDFS中文件,然后使用hadoop fs -getMerge从HDFS目录中提取单个输出文件。

Spark将数据拆分为分区以提高效率,因此可以在多个工作节点之间分配工作负载。如果您合并到少量分区,则会降低其分配工作的能力,而只需1个分区就可以将所有工作放在单个节点上。充其量这将是更慢,最坏的情况是它会耗尽内存并使工作崩溃。