2013-04-11 10 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

+1 ASCIIアートだけです。 –

+0

2番目のステップで多機能MRジョブを使用することはできません。キーはすべてタイムスタンプであると見なされますか?私。渡された値を解釈し、それに応じて処理しますか?レデューサーが特定のキーのすべての値を受け取ることが保証されているのを見ると、タイムスタンプに関連するすべての情報を集めて、必要なすべてのコンポーネントがあるときにだけ書き出すことができます。 – Quetzalcoatl

+0

実際に私はこれを行い、それは働いた。 1つの質問が表示されました:私が望むことを達成するために、map-functionでコンテキスト(context.write(key1、value1) - コードcontext.write(key2、value2)および終了コンテキストの深い部分に3回書きました。 – JustTheAverageGirl

答えて

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 

はまた、あなたがキーとしてkey+some_part_of_valueを検討することができます{キー/値}とマッパ/減速でプレイできるPartitioner and GroupComperatorと呼ばれる方法があります。

関連する問題