私はhadoopとmapreduceが初めてです。誰かがコンバイナーとマッパー内コンバイナーの違いを明確にすることができますか、それとも同じものですか?
1 に答える
コンバイナーは、ネットワークを介してさまざまなクラスター 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() を呼び出しますが、メモリ内マップからの要約/事前集計結果を使用します。したがって、ローカル マップ出力スプール ファイル (レデューサーによって読み取られる) は、はるかに小さくなります。
どちらの場合でも、メモリと外部コンバイナーの両方で、マップ スプール ファイルが小さいため、リデューサーへのネットワーク トラフィックが少なくなるという利点があります。これにより、レデューサー処理も減少します。