2015-11-11 58 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中提取單個輸出文件目錄。

星火將數據分割成效率分區,所以它可以分發許多工人節點間的工作量。如果合併到一個小數目的分區,可以減少它的分發工作的能力,並且只需一分區你把一個節點上的所有工作。最好的情況是這樣會變慢,在最壞的情況下,它會耗盡內存並使作業崩潰。