Как улей выбирает количество редукторов для работы?

В нескольких местах указано, что число редукторов по умолчанию в задаче Hadoop равно 1. Вы можете использовать символ mapred.reduce.tasks, чтобы вручную установить количество редукторов.

Когда я запускаю работу Hive (на Amazon EMR, AMI 2.3.3), у нее есть некоторое количество редукторов больше одного. Глядя на настройки работы, что-то установило mapred.reduce.tasks, я полагаю, что Hive. Как выбрать этот номер?

Примечание: вот некоторые сообщения при запуске задания 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

По умолчанию 1 может быть установлен для установки ванильной Hadoop. Улей переопределяет его.

В улье с открытым исходным кодом (и, вероятно, EMR)

# reducers = (# bytes of input to mappers)
             / (hive.exec.reducers.bytes.per.reducer)

Этот пост говорит, что default hive.exec.reducers.bytes.per.reducer равен 1G.

Вы можете ограничить количество редукторов, созданных этой эвристикой, используя hive.exec.reducers.max.

Если вы точно знаете количество редукторов, вы можете установить mapred.reduce.tasks, и это переопределит все эвристики. (По умолчанию это значение равно -1, что указывает на то, что Hive должен использовать его эвристику.)

В некоторых случаях - скажем, "выберите count (1) из T '- Hive будет устанавливать количество редукторов до 1, независимо от размера входных данных. Они называются" полными агрегатами", и если единственное, что делает запрос, - это полные агрегаты, то компилятор знает, что данные от картографов будут уменьшены до тривиальной суммы, и нет смысла работать с несколькими редукторами.