web-dev-qa-db-ja.com

Hiveはジョブのレデューサーの数をどのように選択しますか?

いくつかの場所では、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>
...
16
dfrankow

デフォルトの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に設定します。これらは「完全集計」と呼ばれ、クエリが実行するのが完全集計のみである場合、コンパイラはマッパーからのデータがわずかな量に削減されることを認識しており、複数のレデューサーを実行しても意味がありません。

17