Hadoopシリーズの最初の投稿では、Hadoopの紹介とmap-reduceプログラムの実行で、Map-Reduceの基本を説明しました。 この記事では、Partitioning、Shuffle、Combiner、Merging、Sorting first、そしてそれがどのように機能するかのようなさまざまなコンポーネントを説明しています。
分割:
の数が2の場合、ハッシュ関数は次のようになります。:
#This function would return the data passes in itfunction hash(data){#this is just for example purposereturn data;}
次に、キー1の場合:
パーティション番号=ハッシュ(1) % 2 = 1;
用キー2:
パーティション番号=ハッシュ(2) % 2 = 0;
キー4の場合:
パーティション番号=ハッシュ(4) % 2 = 0;
つまり、キー1の出力はpartition_1になり、キー2と4の出力はpartition_0になります。
Shuffle:
mapタスクの最終出力では、複数のパーティションが存在する可能性があり、これらのパーティションは別のreduceタスクに移動する必要があります。 Shufflingは基本的にマップ出力パーティションを対応するreduceタスクに転送します。 マップタスクは、マップタスクの完了についてアプリケーションマスターに通知し、アプリケーションマスターは、マップ出力をreduceマシンにコピーするように対応するreducerに通知します。
コンバイナ:
ソート:
キーに基づいてデータをソートするだけです。
マージ:
これは減速機側で発生します。 Reducerは、複数のマップタスクからデータを取得し、マージすることで、異なるマップタスクのデータを1つのユニットにマージし、並べ替え順序を維持します。
マップ-詳細に縮小:
地図:
メモリ内にcircular buffer
があり、バッファに直接書き込みます。 Bufferがしきい値(デフォルトは80%)に達すると、別のbackground thread
を介してspill file
への書き込みを開始します。 Map taskは、バックグラウンドスレッドの実行中に出力をバッファに書き込むことができます。 スピルファイルに書き込む前に、キーと値のペアであるマップ出力が分割され、ソートされます。 コンバイナが存在する場合は、出力サイズを小さくする実行も実行されます。
タスクの後、すべてのスピルファイルが再びソートされ、パーティション化されてソートされた単一のファイルが作成されます。 この最終的な出力ファイルには複数のパーティションがあることを意味します。 ノードのマップタスクが完了した後、その出力はreducerに送信されます。 そのため、mapが<100%未満である間に、タスクを0%以上削減すると表示されます。
マップのみのタスクがある場合、シャッフルはまったくありません。
Reduce:
マップタスクからデータを取得した後、merge phase
中にデータを1つのユニットにマージします。 すべてのファイルを1つに直接マージするのではなく、merge factor
という概念を使用します。 次に、reduceフェーズ中に、ソートされた出力の各キーに対してreduce関数が呼び出されます。 このフェーズの出力は、出力ファイルシステム(通常はHDFS)に直接書き込まれます。
便利なリンク:
糸の紹介と作業