2015-11-11 118 views
1

我开发的星火计划。我需要有一个文件的结果,所以有两种方式合并结果:星火聚结VS HDFS getmerge

  • 合并(火花):

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

  • 合并之后它在HDFS:

Hadoop的FS -getmerge pathOut了l​​ocalPath

哪一个是最有效,最快捷?

是否有任何其他的方法来在HDFS文件合并,而不是它获取到本地路径(如“getmerge”)结果保存到HDFS,?

+0

我强烈建议你不要使用'''FileUtil.copyMerge'''或'''Hadoop的FS -getmerge''',因为它把数据复制到驱动器(查看源代码)。 – Leonard

+0

合并内存很大,也可能导致GC开销。我只是在bash脚本中使用cat *来合并文件,这可以在单独的json调用中触发。 – GameOfThrows

回答

2

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

入住这thread火花用户的邮件列表。

0

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

星火将数据分割成效率分区,所以它可以分发许多工人节点间的工作量。如果合并到一个小数目的分区,可以减少它的分发工作的能力,并且只需一分区你把一个节点上的所有工作。最好的情况是这样会变慢,在最坏的情况下,它会耗尽内存并使作业崩溃。