2016-04-16 11 views
0

私は複数の入力を持っているので、私は2つのマッパーを持っています。また、私は1つのコンバイナを持っています:なぜコンバイナ出力レコード= 0ですか?

class JoinCombiner extends MapReduceBase implements 
     Reducer<TextPair, Text, TextPair, Text> { 

    @Override 
    public void reduce(TextPair key, Iterator<Text> values, 
      OutputCollector<TextPair, Text> output, Reporter reporter) 
      throws IOException { 

     Text nodeId = new Text(values.next()); 
     while (values.hasNext()) { 
      Text node = values.next(); 
      TextPair outValue = new TextPair(nodeId.toString(), "0"); 
      output.collect(outValue , node); 
     } 
    } 
} 

私はこのクラスをReducerとして使用します。しかし、私は、コンバイナとしてそれを使用している場合 - 私は、ログにこの情報を持っている:

Combine input records=6 
Combine output records=0 
Reduce input groups=0 
Reduce shuffle bytes=30 
Reduce input records=0 
Reduce output records=0 

ので、合成器から出力なし - >削減のための入力なし。私は理由を理解できない。 )あなたが考えを持っている場合、いくつかの説明をしてください) ありがとう

答えて

0

あなたが減速器を持っている場合にのみ、コンバイナが実行されます。コンバイナとレデューサの両方を同じクラスに設定してください(可能な場合)。また、減らすタスクの数を設定することを検討してください。

更新:コンバイナでキーを変更しようとしています。コンバイナの目的は、同じキーの値をローカルにまとめてトラフィックを減らすことです。コンバイナクラスのHadoop Tutorial on YDN

インスタンスから

は、マップタスクを実行しているすべてのノード上で実行されています。コンバイナは、指定されたノード上のMapperインスタンスによって発行されたすべてのデータを入力として受け取ります。 Combinerからの出力は、マッパーからの出力ではなく、Reducersに送られます。

私の経験によれば、それは完全に真実ではありません。 Hadoopは、マッパーが発行したキーのみをレデューサーに送信します。その間にコンバイナーがあれば、マッパーと同じキーを発行して、キーに関連付けられた値の数を減らす必要があります。 IMO、コンバイナのキーを変更すると、予期しない動作が発生します。あなたがコンバイナーの簡単なユースケースを理解できるようにするには、単語カウンターを考えてみてください。

Mapper1が発する:

hi 1 
hello 1 
hi 1 
hi 1 
hello 1 

Mapper2が発する:

hello 1 
hi 1 

あなたは7つの出力レコードを持っています。

Combiner1が発する:

hi 3 
hello 2 

Combiner2あなたは(マッパーが走っているのと同じマシン上での意味)ローカルキーの数を減らしたい場合さて、その後、コンバイナを持つことはあなたにこのような何かを与えます放出:

hello 1 
hi 1 

お知らせそのコンバイナは、キーを変更しませんでした。

Reducer1:今、減速時に、次のような値が得られますkey: hi, values: <3, 1>を、あなたが唯一の減速、同じ減速はそれを別のキーを与えることによって、再び呼び出されるしましたので、あなたはhi 4

を発します今回。

Reducer1:key: hello, values: <2, 1>あなたは出力は、マッパーによって放出されたキーに基づいてソートされ

hello 3 
hi 4 

を次のように最終的な出力は次のようになりhello 3

を発します。 レデューサーによって放出されたキーを変更することができますが、レデューサーによって放出されたキーによって出力がソートされることはありません(デフォルト)。希望が役立ちます。

+0

私が持っているものを見てください。これは仕事のための私の構成です: \t \t conf.setCombinerClass(JoinCombiner.class); \t \t conf.setReducerClass(JoinCombiner.class); \t \t \t \t conf.setNumReduceTasks(1); 58 \t \t地図出力がマテリアライズド= \t \t \t地図の入力レコード= 6つの \t \t地図出力レコード= 6 \t \t地図出力バイトバイト= 30 \t \t入力分割:そして、私は、ログに持って \t \t バイト= 1070 \t \t入力レコードの結合= 6 \t \t出力レコードの結合= 0 \t \tシャッフルバイトを削減= 0 \t \t入力グループを削減= 30 \t \t入力レコードを削減= 0 \t \tは= 0 – user3650408

+0

出力レコードを削減あなたはコンバイナにキーを変更しているように見えます。私の更新された答えを見てください。 –

+0

あなたはこのstackoverflowの投稿でコンバイナについてもっと興味深い事実を探すことができます:http://stackoverflow.com/questions/20212884/mapreduce-combiner –

関連する問題