いくつかの場所では、Hadoopジョブのデフォルトのレデューサー数は1であると言われています。mapred.reduce.tasksシンボルを使用して、レデューサーの数を手動で設定できます。
Hiveジョブ(Amazon EMR、AMI 2.3.3)を実行すると、1より大きいレデューサーがいくつかあります。ジョブ設定を見ると、何かがmapred.reduce.tasksを設定している、と私は推測します。その番号をどのように選択しますか?
注:Hiveジョブの実行中に、手がかりとなるメッセージがいくつかあります。
...
Number of reduce tasks not specified. Estimated from input data size: 500
In order to change the average load for a reducer (in bytes):
set Hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set Hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapred.reduce.tasks=<number>
...
デフォルトの1は、VanillaHadoopインストールの場合があります。ハイブはそれを上書きします。
オープンソースのHive(およびEMRの可能性が高い)
# reducers = (# bytes of input to mappers)
/ (Hive.exec.reducers.bytes.per.reducer)
この投稿 デフォルトのHive.exec.reducers.bytes.per.reducerは1Gであると言います。
Hive.exec.reducers.max
を使用して、このヒューリスティックによって生成されるレデューサーの数を制限できます。
必要なレデューサーの数が正確にわかっている場合は、mapred.reduce.tasks
を設定できます。これにより、すべてのヒューリスティックがオーバーライドされます。 (デフォルトでは、これは-1に設定されており、Hiveがヒューリスティックを使用する必要があることを示しています。)
場合によっては、たとえば「Tからcount(1)を選択」と言うと、入力データのサイズに関係なく、Hiveはレデューサーの数を1に設定します。これらは「完全集計」と呼ばれ、クエリが実行するのが完全集計のみである場合、コンパイラはマッパーからのデータがわずかな量に削減されることを認識しており、複数のレデューサーを実行しても意味がありません。