2013-04-11 41 views
5
Mapper/Reducer 1 --> (key,value) 
        / | \ 
        / | \ 
    Mapper/Reducer 2  | Mapper/Reducer 4 
    -> (oKey,oValue)  | -> (xKey, xValue) 
          | 
          | 
        Mapper/Reducer 3 
        -> (aKey, aValue) 

我有一個日誌文件,我與MR1聚合。 Mapper2,Mapper3,Mapper4將MR1的輸出作爲輸入。工作是鏈接的。Hadoop - 如何使用和減少多個輸入?

MR1輸出:

User  {infos of user:[{data here},{more data},{etc}]} 
.. 

MR2輸出:

timestamp  idCount 
.. 

MR3輸出:

timestamp  loginCount 
.. 

MR4輸出:

timestamp  someCount 
.. 

我想輸出從MR2-4結合:最終輸出 - >

timestamp  idCount  loginCount someCount 
.. 
.. 
.. 

是有辦法的w/o豬或蜂巢?我正在使用Java。

+1

單獨爲ASCII藝術+1。 – 2013-04-11 11:58:50

+0

第二步是不可能有一個多功能的MR作業,看到你的關鍵是所有的時間戳?即解釋已經傳入的值並相應地處理它?看到reducer保證接收給定密鑰的所有值,您可以收集與時間戳相關的所有信息,並只在您擁有所需的所有組件時才寫出。 – Quetzalcoatl 2013-04-11 12:01:56

+0

其實我這樣做,它的工作。彈出一個問題:爲了實現我想要的功能,我在映射函數中向context(context.write(key1,value1))寫了3次 - 在代碼context.write(key2,value2)和結尾上下文中更深入。寫(key3,value3)。這是可行的嗎? – JustTheAverageGirl 2013-04-11 13:12:43

回答

1

據我所知,你不能在減速器類輸出的陣列。 什麼我腦海解決你的問題如下:

您的MR1輸出關鍵是{a,b,c}之一是其中根據鍵{timestamp,idCount}{timestamp, loginCount}{timestamp, someCount}對。你會結合MR2-4

所以過程將是這樣的:

MR1 <inputKey,inputValue,outputKey,outPutValue> where outputKey is 
             "a" for outValue`{timestamp,idCount} 
             "b" for outValue`{timestamp, loginCount} 
             "c" for outValue`{timestamp, someCount} 

MR2-4<inputKey,inputValue,outputKey,outPutValue> if inputkey is "a" do MR2 
               if inputkey is "b" do MR3 
               if inputkey is "c" do MR4 

另外,還有一些方法稱爲Partitioner and GroupComperator中,你可以使用{鍵/值}和映射器/減速器發揮可以考慮key+some_part_of_value關鍵。