2013-10-14 60 views
1

我需要幫助解決Hadoop問題。
在我的Java系統中,我有一個創建n記錄的函數。顯然,每條記錄都是一行要寫入Hadoop中的文本文件。如何在單個Hadoop節點上寫入多個記錄

的問題是:
我怎麼能保存所有的ñ記錄在同一個Hadoop的節點?換句話說,我希望記錄看起來像一個獨特的記錄,可以肯定的是,如果這些記錄中的一個(或其副本之一)在一個節點上,那麼當然其他n-1記錄也在同一個節點上。

例如,假設我的函數創建:

record1: 5  los angeles rainy 
record2: 8  new york  sunny 
record3: 2  boston   rainy 

當我在Hadoop中的文本文件追加這三個記錄(三排),就可能發生RECORD1去節點1,RECORD2進入到node2 record3進入節點3。我想知道是否有辦法確保所有三條記錄都存儲在同一個節點上,例如node2,並且它們不存儲在不同的節點上。

感謝您的關注。

+1

聽起來像你可能想要一個自定義的分區,以確保給定的鍵模式結束在一個特定的減速器。不過,我認爲爲這個問題增加更多的清晰度可以幫助人們更好地理解你的問題 – jtravaglini

+0

我已經編輯它,對不起,如果我沒有解釋我 – user2811222

+0

我可能仍然有點困惑你的問題,所以我很抱歉,如果這沒有幫助。如果將縮減器的數量設置爲1,則可以保證將所有記錄寫入相同的文件,但需要耗費更長時間才能完成工作。否則,您可以編寫一個自定義分區程序,該分區程序將指定滿足特定條件的鍵最終以特定的縮減程序結束(即一個文件中的5和8,另一個文件中的2和8)。然而,這些文件將在HDFS中,因此無論您選擇哪個選項,都會在多個節點上進行復制。 – jtravaglini

回答

0

Hadoop將根據默認的HashPartitioner對元組進行分區,並將具有相同密鑰的元組發送到單個reducers進行聚合。如果默認的HashPartitioner不符合要求,則可以編寫一個custom partitionerHere是主幹中HashPartitioner的代碼。

另一種方法是根據分區策略從映射器發出密鑰,並且HashPartitioner會將具有相同密鑰的所有元組發送到reducer中的一個。

另外,請考慮Map和Reduce級別抽象,而不是節點級別。 Hadoop嘗試隱藏集羣的網絡拓撲。

0

通過設置您的並行度爲一。這意味着將您的減速器數量指定爲一個。然後您的所有記錄將被寫入一個零件文件。但缺點是你的工作需要更長的時間才能完成。

相關問題