6

Hadoop パーティショナーについてお聞きしたいのですが、マッパー内に実装されていますか? デフォルトのハッシュ パーティショナーを使用してパフォーマンスを測定する方法 - データ スキューを減らすためのより良いパーティショナーはありますか?

ありがとう

4

2 に答える 2

4

パーティショナーはマッパー内にありません。

以下は、各マッパーで発生するプロセスです -

  • 各マップ タスクは、その出力を (ディスクではなく) 循環バッファー メモリに書き込みます。バッファーがしきい値に達すると、バックグラウンド スレッドがコンテンツをディスクにスピルし始めます。[バッファ サイズは mapreduce.task.io.sort.mb プロパティによって管理され、デフォルトは 100 MB であり、スピルは mapreduce.io.sort.spill.percent プロパティによって管理され、デフォルトは 0.08 または 80% です]。ディスク データにスピルする前に、データが送信されるレデューサーに対応するようにパーティション分割されます 各パーティション内のキーでメモリ内ソートを実行します
  • 各ソートの結果に対してコンバイナー関数を実行します (書き込みおよび転送するデータを少なくします。これは特に行う必要があります)
  • 圧縮 (オプション) [mapred.compress.map.output=true; mapred.map.output.compression.codec=コーデック名]
  • ディスクへの書き込みと出力ファイルのパーティションは、HTTP 経由でレデューサーで使用できるようになります。

以下は、各Reducerで発生するプロセスです

  • 各リデューサーは各マッパーからすべてのファイルを収集し、並べ替え/マージ フェーズ (並べ替えはマッパー側で既に行われています) に移行し、並べ替え順序を維持しながらすべてのマップ出力をマージします。

  • reduce フェーズでは、ソートされた出力のキーごとに reduce 関数が呼び出されます。

ここに画像の説明を入力

以下は、キーの分割の実際のプロセスを示すコードです。getpartition() は、ハッシュ コードに基づいて、特定のキーを送信する必要があるパーティション番号/リデューサーを返します。ハッシュコードはキーごとに一意である必要があり、ランドスケープ全体でハッシュコードは一意であり、キーに対して同じである必要があります。この目的のために、hadoop は、Java のデフォルトのハッシュ コードを使用する代わりに、そのキーに独自のハッシュコードを実装します。

 Partition keys by their hashCode(). 

        public class HashPartitioner<K, V> extends Partitioner<K, V> {
        public int getPartition(K key, V value,
                                 int numReduceTasks) {
           return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
       }

       }
于 2015-04-21T02:17:57.020 に答える