Hadoop学習三十五:Hadoop-CapReduce MapTask and ReduceTask
6305 ワード
一.前文
http://zy19982004.iteye.com/blog/2037549全体としてJobが実行するプロセスが記述されており、大きく3つのステップに分かれている.準備データ map reduce 清掃 その中で最も主要なのは当然map reduceの過程であり,mapはMapTaskが主導的に完成し,reduceはReduceTaskが主導的に完成した.まず公式の図を見てみましょう
二.MapTask
MapTaskは以下のステップに分かれています Read:InputSplitからデータを読み出し、key/valueを解析します. Map:上記key/valueは、カスタムMapperクラスによって処理されます.処理結果もkey/value形式です. WriteまたはCollect:MapContextと呼ばれ、処理結果がリングメモリバッファkvbufferに書き込まれます. Combine(Combineがあれば)&SortAndSpill:MapTaskの出力結果が多いとメモリが爆発する可能性があるので、バッファ内のデータを一定の条件下で一時的にディスクに書き込み、このバッファを再利用する必要があります.このメモリからディスクにデータを書く過程はSpillと呼ばれ、中国語ではオーバーフローと訳され、字面の意味は直感的だ.このオーバーフローは,バッファへのmap結果の書き込みに影響を及ぼさない単独スレッドによって達成される.オーバーフロースレッドの起動時にmapの結果出力を阻止するべきではないので、バッファ全体にオーバーフローの割合spillperがあります.この割合はデフォルトで0.8です.つまり、バッファのデータがしきい値(kvbuffer.length*spillper=100 MB*0.8=80 MB)に達した場合、オーバーフロースレッドが起動し、80 MBのメモリをロックしてオーバーフロープロセスを実行します.Maptaskの出力結果は残りの20 MBのメモリにも書くことができ、互いに影響しない.クラスMapTask initメソッド Combine(Combineがある場合)&Merge:1つのMapTaskが完了すると、複数のspillファイルが生成する可能性があります.これらのspillファイルをマージし、1つのfileを生成する必要があります.outファイル.MapTask mergePartsメソッドを参照してください.
三.ReduceTask
ReduceTaskは次のステップに分けられます. Copy(Shuffleとも呼ばれる):Localモードの場合、直接mv&rename;クラスタモードの場合、HTTPでcopyデータを要求し、ReduceTaskはそれぞれのMapTaskから自分のデータをリモートコピーし、メモリに入れ、バルブ値を超えたらディスクに書き込む. Merge&Sort:リモートcopyの過程で、複数の自分のものを1つのデータに統合し、ソートする必要があります.各シートはすでにソートされているので、一度に並べ替えるだけでいいです. Reduce:カスタムReduceクラスによってHdfsにデータが書き込まれます.
四.自分でその中のいくつかのステップを描きました MapTask Spill MapTask Merge & Combine ReduceTask Copy Merge & Sort
五.spillのさらなる理解
test-data.txtは145 Mであり、2つのInputSplit(論理分割のみ)に分けられる.
MapTask 1処理hdfs://192.168.1.200:9000/user/root/input/test-data.txt:0+13417228,MapTask 2処理hdfs://192.168.1.200:9000/user/root/input/test-data.txt:134217728+18093772.
80 Mでspillを開始すると、MapTaskは最大2つのspillしかないのに、なぜ今4つ(3つは上記の図のように、もう1つはRecordWriter.close(mapperContext)でメモリflushをハードディスクに)現れたのか.kvbufferの構造はkey/valueだけが格納されているわけではないため、kvbufferの一部はpartitionerのようなkvmetaを格納している.
kvbufferの構造については、私は深く考えません.http://caibinbupt.iteye.com/blog/401374のいくつかのブログを参考にすることができますが、彼はHadoop 2ではありません.2.0.
また、この図を参考にして、http://www.cnblogs.com/forfuture1978/archive/2010/11/19/1882268.html
以上が私のMapTaskとReduceTaskに対する浅い認識です.私が書いたすべての文章は正しいことを保証した上でもっと分かりやすいことを望んでいます.間違いがあれば、言葉遣いが適切でないなど、指摘を歓迎します.
http://zy19982004.iteye.com/blog/2037549全体としてJobが実行するプロセスが記述されており、大きく3つのステップに分かれている.
二.MapTask
MapTaskは以下のステップに分かれています
final float spillper =job.getFloat(JobContext.MAP_SORT_SPILL_PERCENT, (float)0.8);
final int sortmb = job.getInt(JobContext.IO_SORT_MB, 100);
int maxMemUsage = sortmb << 20;//100M
kvbuffer = new byte[maxMemUsage];
softLimit = (int)(kvbuffer.length * spillper);
bufferRemaining = softLimit;
を参照してさらに補足することができ、Combineがあれば、このステップも機能し、sortAndSpillメソッド// combiner ,
if (null == combinerClass) {
……
writer.append(key, value);
++spindex;
}
else {
……
// combiner , combine, combiner.reduce(…)
combineAndSpill(kvIter, combineInputCounter);
}
を参照してhttp://zy19982004.iteye.com/blog/2037549に図を補足することができ、この図がspillプロセスである. 三.ReduceTask
ReduceTaskは次のステップに分けられます.
四.自分でその中のいくつかのステップを描きました
五.spillのさらなる理解
test-data.txtは145 Mであり、2つのInputSplit(論理分割のみ)に分けられる.
MapTask 1処理hdfs://192.168.1.200:9000/user/root/input/test-data.txt:0+13417228,MapTask 2処理hdfs://192.168.1.200:9000/user/root/input/test-data.txt:134217728+18093772.
80 Mでspillを開始すると、MapTaskは最大2つのspillしかないのに、なぜ今4つ(3つは上記の図のように、もう1つはRecordWriter.close(mapperContext)でメモリflushをハードディスクに)現れたのか.kvbufferの構造はkey/valueだけが格納されているわけではないため、kvbufferの一部はpartitionerのようなkvmetaを格納している.
kvmeta.put(kvindex + PARTITION, partition);
kvmeta.put(kvindex + KEYSTART, keystart);
kvmeta.put(kvindex + VALSTART, valstart);
kvmeta.put(kvindex + VALLEN, distanceTo(valstart, valend));
kvbufferの構造については、私は深く考えません.http://caibinbupt.iteye.com/blog/401374のいくつかのブログを参考にすることができますが、彼はHadoop 2ではありません.2.0.
また、この図を参考にして、http://www.cnblogs.com/forfuture1978/archive/2010/11/19/1882268.html
以上が私のMapTaskとReduceTaskに対する浅い認識です.私が書いたすべての文章は正しいことを保証した上でもっと分かりやすいことを望んでいます.間違いがあれば、言葉遣いが適切でないなど、指摘を歓迎します.