5

私はhadoopとmapreduceが初めてです。誰かがコンバイナーとマッパー内コンバイナーの違いを明確にすることができますか、それとも同じものですか?

4

1 に答える 1

6

コンバイナーは、ネットワークを介してさまざまなクラスター Reducer にシャッフルされる前にデータを事前に集約するために、各 Mapper マシンでローカルに実行されるプロセスであることは既にご存じでしょう。

マッパー内コンバイナーは、この最適化をもう少し進めます。集計は、ローカルディスクに書き込むことさえしません。マッパー自体のメモリ内で発生します。

マッパー内コンバイナーは、setup() および cleanup() メソッドを利用してこれを行います。

org.apache.hadoop.mapreduce.Mapper

次の行に沿ってメモリ内マップを作成します。

Map<LongWritable, Text> inmemMap = null
   protected void setup(Mapper.Context context) throws IOException, InterruptedException {
   inmemMap  = new Map<LongWritable, Text>();
 }

次に、各 map() 呼び出し中に、(各値に対して context.write() を呼び出す代わりに) メモリ マップよりも値を追加します。最後に、Map/Reduce フレームワークは自動的に以下を呼び出します。

protected void cleanup(Mapper.Context context) throws IOException, InterruptedException {
  for (LongWritable key : inmemMap.keySet()) {
      Text myAggregatedText = doAggregation(inmemMap.get(key))// do some aggregation on 
                   the inmemMap.     
      context.write(key, myAggregatedText);
  }
}

毎回 context.write() を呼び出す代わりに、メモリ内マップにエントリを追加することに注意してください。次に cleanup() メソッドで context.write() を呼び出しますが、メモリ内マップからの要約/事前集計結果を使用します。したがって、ローカル マップ出力スプール ファイル (レデューサーによって読み取られる) は、はるかに小さくなります。

どちらの場合でも、メモリと外部コンバイナーの両方で、マップ スプール ファイルが小さいため、リデューサーへのネットワーク トラフィックが少なくなるという利点があります。これにより、レデューサー処理も減少します。

于 2015-01-29T02:07:20.110 に答える