как уменьшить количество контейнеров в запросе - PullRequest
1 голос
/ 01 апреля 2019

У меня есть запрос, использующий много контейнеров и много памяти.(97% используемой памяти).Есть ли способ установить количество контейнеров, используемых в запросе, и ограничить максимальный объем памяти?Запрос выполняется на Tez.

Заранее спасибо

1 Ответ

2 голосов
/ 01 апреля 2019

Управление числом преобразователей:

Количество преобразователей зависит от различных факторов, таких как распределение данных между узлами, формат ввода, механизм выполнения и параметры конфигурации.См. Также Как работает параллелизм начальной задачи

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...