2012-06-16 41 views
12

是否有可能與Hadoop中的MapReduce多個不同的映射器多個輸入?每個映射器類都在不同的輸入集上工作,但它們都會發出同一個reducer所使用的鍵值對。請注意,我不是在討論鏈接映射器,而是在討論並行運行不同的映射器,而不是按順序運行。在Hadoop MapReduce中可以有多個不同映射器的輸入嗎?

回答

13

這就是所謂的加盟。

您要使用的映射器和減速器在mapred。*包(年紀大了,但仍然支持)。較新的包(mapreduce。*)只允許一個映射器輸入。隨着mapred包,您可以使用MultipleInputs類來定義連接:

MultipleInputs.addInputPath(jobConf, 
        new Path(countsSource),  
        SequenceFileInputFormat.class, 
        CountMapper.class); 
MultipleInputs.addInputPath(jobConf, 
        new Path(dictionarySource), 
        SomeOtherInputFormat.class, 
        TranslateMapper.class); 

jobConf.setJarByClass(ReportJob.class); 
jobConf.setReducerClass(WriteTextReducer.class); 

jobConf.setMapOutputKeyClass(Text.class); 
jobConf.setMapOutputValueClass(WordInfo.class); 

jobConf.setOutputKeyClass(Text.class); 
jobConf.setOutputValueClass(Text.class); 
+5

較新的apis('mapreduce'不''mapred')有'MultipleInputs':http://hadoop.apache.org/common/docs/r1.0.3/api/org/apache/hadoop/mapreduce/lib /input/MultipleInputs.html –

+0

@Donald Miner:絕對正確。 –

+0

@DonaldMiner有些版本可以,但至少0.20.x似乎不是,例如注意這裏缺少MultipleInputs:http://hadoop.apache.org/docs/r0.20.205.0/api/org/apache/hadoop/mapreduce/lib/input/ – kabuko

2

我會回答你的問題有一個問題,2個解答和反建議。

的問題是:你在並行運行異構地圖就業看到什麼好處,而不是串聯運行它們,輸出,可以適當打亂均勻的結果嗎?是否想避免兩次傳遞相同的記錄,一次使用身份映射?

第一個答案是同時安排兩個僅使用mapper的工作,每個工作都在您的船隊的一半(或任何與輸入數據大小最匹配的比率)上,輸出均勻的結果,然後是僅執行加入的reducer-only作業。

第二個答案是創建一個自定義的InputFormat是能夠識別和轉換異類輸入的兩個口味。這非常難看,但它可以讓你避免第一個建議的不必要的標識圖。

反推薦是而不是使用Chris的答案中棄用的Hadoop API。 Hadoop非常年輕,但API在穩定「新」風格。你將最終到達版本鎖定。

+0

運行幾個mapper的原因是你可以執行FlumeJava論文中的平坦操作。來自不同映射器的輸出可以參與相同的洗牌操作。 – tibbe

相關問題