Управление числом преобразователей:
Количество преобразователей зависит от различных факторов, таких как распределение данных между узлами, формат ввода, механизм выполнения и параметры конфигурации.См. Также Как работает параллелизм начальной задачи
MR использует CombineInputFormat, а Tez использует групповые разбиения.
Tez:
set tez.grouping.min-size=16777216; -- 16 MB min split
set tez.grouping.max-size=1073741824; -- 1 GB max split
Увеличьте эти цифры, чтобы уменьшить количество работающих картографов.
Кроме того, Mappers работают на узлах данных, где расположены данные, поэтому ручное управление числом картографических устройств не простая задача, не всегда возможно объединить ввод.
Управление количеством редукторов:
Количество редукторов, определенное в соответствии с
mapreduce.job.reduces
- Количество заданий по умолчанию на задание по умолчанию.Обычно устанавливается на простое число, близкое к числу доступных хостов.Игнорируется, когда
mapred.job.tracker
является "локальным".Hadoop по умолчанию имеет значение 1, тогда как Hive использует -1 в качестве значения по умолчанию.Установив для этого свойства значение -1, Hive автоматически определит, какое должно быть число редукторов.
hive.exec.reducers.bytes.per.reducer
- по умолчанию в Hive 0.14.0 и более ранних версиях установлено значение 1 ГБ.
Также hive.exec.reducers.max
- Максимальное количество редукторов, которые будут использоваться.Если mapreduce.job.reduces
отрицательно, Hive будет использовать это как максимальное количество редукторов при автоматическом определении количества редукторов.
Просто установите hive.exec.reducers.max=<number>
, чтобы ограничить количество работающих редукторов.
Если вы хотите увеличить параллелизм редукторов, увеличьте hive.exec.reducers.max и уменьшите hive.exec.reducers.bytes.per.reducer.
Настройки памяти
set tez.am.resource.memory.mb=8192;
set tez.am.java.opts=-Xmx6144m;
set tez.reduce.memory.mb=6144;
set hive.tez.container.size=9216;
set hive.tez.java.opts=-Xmx6144m;
Настройки по умолчанию означают, что фактическая задача Tez
будет использовать настройки памяти картографа:
hive.tez.container.size = mapreduce.map.memory.mb
hive.tez.java.opts = mapreduce.map.java.opts
Прочтите это для получения более подробной информации: Demystify ApacheНастройка памяти Tez - шаг за шагом
Я бы предложил сначала оптимизировать запрос.Если возможно, используйте map-join, используйте векторизацию, добавьте distribute by partitin key
, если вы пишете многораздельную таблицу, чтобы уменьшить потребление памяти на редукторах и, конечно, напишите хороший sql.