Hadoop学習三十五:Hadoop-CapReduce MapTask and ReduceTask

6305 ワード

一.前文
http://zy19982004.iteye.com/blog/2037549全体としてJobが実行するプロセスが記述されており、大きく3つのステップに分かれている.
  • 準備データ
  • map reduce
  • 清掃
  • その中で最も主要なのは当然map reduceの過程であり,mapはMapTaskが主導的に完成し,reduceはReduceTaskが主導的に完成した.まず公式の図Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第1张图片を見てみましょう
     
    二.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メソッド
    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プロセスである.Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第2张图片
  • Combine(Combineがある場合)&Merge:1つのMapTaskが完了すると、複数のspillファイルが生成する可能性があります.これらのspillファイルをマージし、1つのfileを生成する必要があります.outファイル.MapTask mergePartsメソッドを参照してください.Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第3张图片

  •  
    三.ReduceTask
    ReduceTaskは次のステップに分けられます.
  • Copy(Shuffleとも呼ばれる):Localモードの場合、直接mv&rename;クラスタモードの場合、HTTPでcopyデータを要求し、ReduceTaskはそれぞれのMapTaskから自分のデータをリモートコピーし、メモリに入れ、バルブ値を超えたらディスクに書き込む.
  • Merge&Sort:リモートcopyの過程で、複数の自分のものを1つのデータに統合し、ソートする必要があります.各シートはすでにソートされているので、一度に並べ替えるだけでいいです.
  • Reduce:カスタムReduceクラスによってHdfsにデータが書き込まれます.

  • 四.自分でその中のいくつかのステップを描きました
  • MapTask Spill Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第4张图片
  • MapTask Merge & Combine Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第5张图片
  • ReduceTask Copy Merge & Sort Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第6张图片

  • 五.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
      Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask_第7张图片
     
     
    以上が私のMapTaskとReduceTaskに対する浅い認識です.私が書いたすべての文章は正しいことを保証した上でもっと分かりやすいことを望んでいます.間違いがあれば、言葉遣いが適切でないなど、指摘を歓迎します.