1

次のクエリを実行しようとしていますが、2番目のジョブに1つのレデューサーしか使用されていないため、データの読み込みに時間がかかります。

INSERT INTO TABLE ddb_table SELECT *FROMdata_dumpランクで並べ替えdescLIMIT1000000;

上記のクエリに対して2つのジョブが作成されます。最初のジョブは、80個のマッパーと約22個のレデューサーを使用しているため、かなり高速に実行されます。セカンドジョブマッパーは高速ですが、レデューサーが1つしかないため、非常に低速です。

set mapred.reduce.tasks = 35を使用してレデューサー数を増やしようとしましたが、興味深いことに、最初のジョブにのみ適用され、2番目のジョブには適用されませんでした。

なぜ単一のレデューサーが使用されるのですか?ソートバイ句が原因ですか?最大レデューサーを設定するにはどうすればよいですか?

それを行うためのより良い方法はありますか?

4

2 に答える 2

4

私は肯定的ではありませんが、私の直感では、「並べ替え」ではなく「制限」が原因であるということです。実際、「並べ替え」は明示的に各レデューサー内でのみ並べ替えを行うため、完全な順序付けは得られません。

問題は、複数のレデューサーがある場合、それらが 1000000 レコードに達したことを認識できるほど十分に調整されていないことです。したがって、制限を行うには、レコード数のカウントを維持し、制限に達すると新しいレコードの出力を停止する 1 つのレデューサーのみである必要があります。

実際、複数のレデューサーで「並べ替え」と「制限」を行うことができたとしても、どのレデューサーが最も速く実行されるかに応じて、実行ごとに異なる出力が得られる可能性があるため、何をしようとしているのかはわかりませんdo here はそもそも理にかなっています。

于 2012-09-04T23:36:12.563 に答える
2

これは、Hadoop でデフォルトの Partitioner を使用してソートする方法とまったく同じです。デフォルトのパーティショニングではハッシュコード mod 数のレデューサーが使用されるため、35 のレデューサーが必要な場合は、35 個の出力ファイルが取得され、それぞれが並べ替えられますが、範囲が重複しています。たとえば、アルファベット文字 [a..z] で始まるキーがあるとします: file1 (a1,a2,a15,d3,d5,f6), file2(a3,a5,b1,z3) など。キー範囲 1 つの Reducer が必要か、パーティショナーがキーの性質をより認識できるようにする必要があります。たとえば、同じ最初の文字を持つすべてのキーを同じパーティションに送信するようにパーティショナーを作成すると、複数のファイルが存在します。出力に含まれますが、範囲が重複することはありません。例 file1 (a1,a2,a3,a5,a15), file2(b1),file3(....) file4(d3,d6) など。標準の Hadoop ジョブまたは Apache PIG を使用する場合に機能します。

于 2012-09-03T21:17:35.500 に答える