Hadoopシャッフルプロセス

まず、公式マップに移動します。
ここに画像の説明を挿入
次に、簡単なプロセスの説明を作成します(例としてワードカウントを使用):
それに関係するポイントにはリングバッファーがあります。
ここに画像の説明を挿入
詳細な説明:
例としてワードカウントを使用します(5つのマップと3つの削減があると仮定します)。

マップステージ

1. mapタスクが実行されるとき、その入力データはHDFSブロックから取得されますもちろん、MapReduceの概念では、mapタスクは分割のみを読み取ります。splitとblockの間の対応は多対1であり、デフォルトは1対1です。
2.マッパーを実行した後、マッパーの出力がそのようなキーと値のペアであることがわかりました。キーは "hello"で、値は値1です。現在のマップ終了は1を追加する操作のみを実行するため、結果セットはリデュースタスクにマージされます。このジョブには3つの削減タスクがあります。現在の「こんにちは」にどの削減を割り当てる必要がありますか?今すぐ決定する必要があります。

  • パーティション(Partition)
    MapReduceは、Partitionerインターフェースを提供します。その役割は、キーまたは値とリデューサーの数に基づいて、現在の出力データのペアが最終的に引き継がれるべき還元タスクを決定することです。デフォルトでは、キーハッシュを使用して、reduceタスクの数をモジュロ化します。moduloのデフォルトモードは、レデューサーの処理能力を減らすことだけですが、ユーザーがパーティショナーを自分で必要とする場合は、カスタマイズしてジョブに設定できます。
    分割は3つのパーティションに分割されます。
  • 並べ替えの
    に、並べ替えは最初に2次並べ替えを実行し、最初にデータが属するパーティションに従って並べ替え、次に各パーティションのデータをキーで並べ替えますパーティション分割の目的は、レコードを異なるレデューサーに分割して、ロードバランシングを実現することです。後のレデューサーは、パーティションに従って対応するデータを読み取ります。次に、コンバイナを実行します(設定されている場合)。コンバイナの本質は、レデューサでもあります。その目的は、最初にディスクに書き込まれるファイルを処理して、ディスクに書き込まれるデータの量を削減することです。
  • スピル(スピル)
    Map側は入力データを処理して中間結果を生成し、この中間結果はHDFSではなくローカルディスクに書き込まれます。各マップの出力は、最初にメモリバッファー(リングバッファー)に書き込まれます。バッファーの機能は、マップ結果をバッチで収集し、ディスクIOの影響を軽減することです。キー/値のペアとパーティションの結果がバッファーに書き込まれます。もちろん、書き込む前に、キーと値の値はバイト配列にシリアル化されます。書き込まれたデータが設定されたしきい値に達すると、システムはバッファデータをディスクに書き込むスレッドを開始します。このプロセスはスピルと呼ばれます。
    このオーバーフロー書き込みは別のスレッドによって行われ、マップ結果をバッファーに書き込むスレッドには影響しません。オーバーフロー書き込みスレッドは、開始時にマップ結果の出力を妨げないようにする必要があるため、バッファー全体にスピル書き込みパーセンテージがあります。この比率はデフォルトで0.8です。
    ローカルディスクにデータを書き込んでスピルファイルを生成します(スピルファイルは{mapred.local.dir}で指定されたディレクトリに保存され、MapReduceタスクの完了後に削除されます)。

  • 各Mapタスクをマージ(マージ)すると、複数のスピルファイルが生成される場合があります。各Mapタスクが完了する前に、これらのスピルファイルは、多方向マージアルゴリズムによって1つのファイルにマージされますこの操作はマージと呼ばれます(スピルファイルは{mapred.local.dir}で指定されたディレクトリに保存され、マップタスクの完了後に削除されます)。マップは最終的にファイルを上書きします。
    この時点で、マップシャッフルプロセスは終了です。

ステージを減らす

縮小側のシャッフルには、主にコピー、ソート(マージ)、および縮小の3つの段階があります。


  • 最初にコピーでは、マップ側で生成された出力ファイルをリデュース側にコピーしますが、各リデューサーはどのデータを処理する必要があるかをどのようにして知るのでしょうか。Map側でパーティション化する場合、実際には、各Reducerが処理するデータを指定することと同じです(パーティションはReducerに対応します)。したがって、データをコピーするとき、Reduceはそれ自体に対応するパーティション内のデータをコピーするだけで済みます。それだけです。**各レデューサーは1つ以上のパーティションを処理しますが、最初に各マップの出力から対応するパーティションのデータをコピーする必要があります。
  • マージ(ソート)
    データを最初にメモリバッファーにコピーします。ここでのバッファーサイズは、マップ側よりも柔軟です。これは、JVMヒープサイズ設定に基づいています。シャッフルステージレデューサーが実行されないため、メモリの一部は、シャッフルによって使用されます。
    ここで強調する必要があるのは、
    マージフェーズ(ソートフェーズとも呼ばれる)です。このフェーズの主な仕事はマージソートを実行することです。Map側からReduce側にコピーされたデータは順序付けされているため、マージソートに非常に適しています。
    マージには3つの形式があります。1)メモリからメモリ2)メモリからディスク3)ディスクからディスク。最初のフォームはデフォルトでは有効になっていません。
    メモリにコピーされたデータの量が特定のしきい値に達すると、メモリとディスクのマージが開始されます。つまり、マップ側と同様の2番目のマージ方法です。これも上書きプロセスです。このプロセスでコンバイナーを設定すると、有効にすると、ディスク上に多数の上書きファイルが生成されます。このマージメソッドは、マップの端にデータがなくなるまで実行されています。
    次に、3番目のディスク間マージ方法を開始して、最終的なファイルを生成します。
  • リデュースを
    継続的にマージした、最後に「最終ファイル」が生成されます。なぜ引用符を追加するのですか?このファイルはディスク上に存在する可能性があるため、メモリ内にも存在する可能性があります(データのサイズに応じて)。私たちにとっては、もちろんそれをメモリに格納し、Reduceへの入力として直接使用することを望んでいますが、デフォルトでは、このファイルはディスクに格納されます。
    次に、Reduceが実行され、このプロセスで最終出力が生成され、HDFSに書き込まれます。
元の記事を9件公開 賞賛0件 訪問62件

おすすめ

転載: blog.csdn.net/yangbllove/article/details/105547087