2013-05-04 70 views
1

我運行了一系列的EMR MapReduce工作。然而,第三MapReduce作業需要從第二MapReduce作業輸出的數據,並輸出基本上是超過一百萬的鍵值對(包括鍵和值小於1KB較少)。有沒有一種很好的方式將這些信息存儲在與EMR相同的機器上的分佈式存儲中,以便隨後的作業可以訪問這些信息?我看着DistributedCache,但它更多的是存儲文件?我不確定Hadoop是否針對存儲一百萬個小文件進行了優化。的Hadoop/EMR如何存儲鍵值對

或者我可以用某種方法使用另一個MapReduce作業將所有鍵值對合併到一個輸出文件中,然後將整個文件放入DistributedCache

請指教。謝謝!

回答

0

通常,圖的輸出減少作業存儲在HDFS(或S3)。此作業的縮減器數量決定了輸出文件的數量。你怎麼有一百萬個小文件?你是否運行了一百萬個減速器?我不確定。

因此,如果你定義一個減速器爲您的第二職業,你會自動與一個輸出文件,該文件將被存儲在HDFS結束。你的第三份工作將能夠訪問和處理這個文件作爲輸入。如果第二項工作需要多個減速器,則會有多個輸出文件。 100萬個鍵值對,每個鍵值爲1 KB,給你一個< 2 GB的文件。與64 MB的HDFS塊大小,你會與大小N * 64 MB的結果文件,這將允許該第三作業並行地處理的塊(多個映射器)結束。

您應該使用DistributedCache只有當整個文件需要單一映射器讀取。然而,最大的尺寸。 2 GB這是一個相當有缺陷的方法。

+0

感謝您的回答,我們最後使用'DistributedCache',但在'設置(上下文)構建''HashMap'下一'MapReduce'的方法,使每個節點只有構建地圖一次:] – Jin 2013-05-06 01:59:53

+0

@JIN不用客氣。您也可能想嘗試將JVM用於多個映射器,以便爲N個映射器只讀取一次散列映射。見http://stackoverflow.com/questions/4877691/is-it-possible-to-run-several-map-task-in-one-jvm – harpun 2013-05-06 17:07:40