Руководство по настройке размера кластера Azure HDInsight Interactive Query (Hive LLAP)

В этом документе описывается размер кластера интерактивных запросов HDInsight (кластер Hive LLAP) для обычной рабочей нагрузки для достижения разумной производительности. Обратите внимание, что в этом документе приведены общие рекомендации и для конкретных рабочих нагрузок может потребоваться специфичная тонкая настройка.

Типы виртуальных машин Azure по умолчанию для кластера HDInsight Interactive Query (LLAP)

Тип узла Экземпляр Размер
Head D13 v2 8 vcpus, 56 ГБ ОЗУ, 400 ГБ SSD
Рабочая роль D14 v2 16 vcpus, 112 ГБ ОЗУ, 800 ГБ SSD
ZooKeeper A4 v2 4 , 8 ГБ ОЗУ, 40 vcpusГБ SSD

Примечание. Все рекомендуемые значения конфигураций основаны на рабочем узле типа D14 версии 2

Configuration.

Ключ конфигурации Рекомендуемое значение Description
yarn.nodemanager.resource.memory-mb 102400 (MБ) Общий объем памяти в МБ, выделенный для всех контейнеров YARN на узле.
yarn.scheduler.maximum-allocation-mb 102400 (MБ) Максимальное выделение памяти в МБ для каждого запроса контейнера в Resource Manager. Запросы на память выше этого значения не будут выполнены.
yarn.scheduler.maximum-allocation-vcores 12 Максимальное количество ядер ЦП для каждого запроса контейнера в Resource Manager. Запросы на получение больших значений не будут выполнены.
yarn.nodemanager.resource.cpu-vcores 12 Количество ядер ЦП на каждый диспетчер узлов, которые могут быть выделены для контейнеров.
yarn.scheduler.capacity.root.llap.capacity 85 (%) Выделение емкости YARN для очереди LLAP
tez.am.resource.memory.mb 4096 (МБ) Объем памяти в МБ, используемый Tez AppMaster.
hive.server2.tez.sessions.per.default.queue <number_of_worker_nodes> Число сеансов для каждой очереди, заданной в hive.server2.tez.default.queues. Это число соответствует числу координаторов запросов (мастер-приложений Tez).
hive.tez.container.size 4096 (МБ) Заданный размер контейнера Tez в МБ.
hive.llap.daemon.num.executors 19 Число исполнителей на одну управляющую программу LLAP.
hive.llap.io.threadpool.size 19 Размер пула потоков для исполнителей.
hive.llap.daemon.yarn.container.mb 81920 (МБ) Общий объем памяти в МБ, используемый отдельными управляющими программами LLAP (памяти на одну управляющую программу).
hive.llap.io.memory.size 242688 (МБ) Размер кэша в МБ на одну управляющую программу LLAP при условии, что кэш SSD включен.
hive.auto.convert.join.noconditionaltask.size 2048 (МБ) Объем памяти в МБ для соединения с сопоставлением.

Архитектура/компоненты LLAP:

`LLAP Architecture/Components`.

Оценка размеров управляющей программы LLAP

1. Определение общего выделения памяти YARN для всех контейнеров на узле

Конфигурация: yarn.nodemanager.resource.memory-mb

Это значение указывает максимальный общий объем памяти в МБ, которая может использоваться контейнерами YARN на каждом узле. Указанное значение должно быть меньше, чем общий объем физической памяти на этом узле.
Общий объем памяти для всех контейнеров YARN на узле = (Общий объем физической памяти – память для ОС + другие службы)
Присвойте этому параметру значение около 90 % от всей доступной оперативной памяти.
Для D14 v2 рекомендуется значение 102400 МБ

2. Определение максимального объема памяти на запрос контейнера YARN

Конфигурация: yarn.scheduler.maximum-allocation-mb

Это значение указывает на максимальное выделение памяти в МБ для каждого запроса контейнера в Resource Manager. Запросы на память выше указанного значения не будут выполнены. Resource Manager может предоставлять память контейнерам с шагом приращения yarn.scheduler.minimum-allocation-mb и не может превышать размер, заданный ключом yarn.scheduler.maximum-allocation-mb. Указанное значение не должно превышать общую память для всех контейнеров на узле, заданную ключом yarn.nodemanager.resource.memory-mb.
Для рабочих узлов D14 v2 рекомендуется значение 102400 МБ

3. Определение максимального количества vcores запросов на контейнер YARN

Конфигурация: yarn.scheduler.maximum-allocation-vcores

Это значение конфигурации указывает максимальное количество ядер виртуального ЦП для каждого запроса контейнера в Resource Manager. Запросив большее vcores число, это значение не вступит в силу. Это является глобальным свойством планировщика YARN. Для контейнера управляющей программы LLAP это значение может иметь значение 75 % от общего количества доступных vcores. Оставшиеся 25 % должны быть зарезервированы для NodeManager, DataNode и других служб, работающих на рабочих узлах.
На 16 vcores виртуальных машинах D14 версии 2 и 75 % всего 16 vcores можно использовать контейнером управляющей программы LLAP.
Для D14 v2 рекомендуется значение 12.

4. Количество одновременных запросов

Конфигурация: hive.server2.tez.sessions.per.default.queue

Это значение конфигурации определяет количество сеансов Tez, которые должны быть запущены параллельно. Эти сеансы Tez запускаются для каждой очереди, указанной в hive.server2.tez.default.queues. Он соответствует количеству Tez AMs (координаторы запросов). Рекомендуется, чтобы это значение совпадало с количеством рабочих узлов. Число Tez AM может быть выше, чем число узлов управляющей программы LLAP. Основная задача мастер-приложений Tez заключается в координации выполнения запроса и назначении фрагментов плана запроса соответствующим управляющим программам LLAP для выполнения. Сохраните это значение как несколько из многих узлов управляющей программы LLAP, чтобы обеспечить более высокую пропускную способность.

Кластер HDInsight по умолчанию имеет четыре управляющие программы LLAP, выполняющиеся на четырех рабочих узлах, поэтому рекомендуемое значение равно 4.

Ползунок пользовательского интерфейса Ambari для переменной конфигурации Hive hive.server2.tez.sessions.per.default.queue:

`LLAP maximum concurrent queries`.

5. Размер главного размера контейнера Tez и приложения Tez

Конфигурация: tez.am.resource.memory.mb, hive.tez.container.size

tez.am.resource.memory.mb определяет размер мастер-приложения Tez.
Рекомендуется использовать значение 4096 МБ.

hive.tez.container.size определяет объем памяти, выделяемый контейнеру Tez. Это значение должно быть задано в диапазоне от минимального (yarn.scheduler.minimum-allocation-mb) до максимального (yarn.scheduler.maximum-allocation-mb) размера контейнера YARN. Исполнители управляющей программы LLAP используют это значение для ограничения использования памяти каждым исполнителем.
Рекомендуется использовать значение 4096 МБ.

6. Выделение емкости очереди LLAP

Конфигурация: yarn.scheduler.capacity.root.llap.capacity

Это значение указывает на процент емкости, выделенной для очереди LLAP. Выделенная емкость может отличаться для разных рабочих нагрузок в зависимости от настройки очередей YARN. Если рабочая нагрузка — это только операции чтения, задайте для нее значение 90 % емкости. Однако если рабочая нагрузка объединяет в себе операции обновления, удаления или слияния с помощью управляемых таблиц, рекомендуется предоставить для очереди LLAP 85 % емкости. Оставшиеся 15 % емкости могут использоваться другими задачами, такими как сжатие и т. п., для выделения контейнеров из очереди по умолчанию. Таким образом ресурсы YARN не будут расходоваться на задачи в очереди по умолчанию.

Для рабочих узлов D14v2 рекомендуемое значение для очереди LLAP равно 85.
(Для рабочих нагрузок только чтения, его при необходимости можно увеличить до 90.)

7. Размер контейнера управляющей программы LLAP

Конфигурация: hive.llap.daemon.yarn.container.mb

Управляющая программа LLAP запускается как контейнер YARN на каждом рабочем узле. Общий объем памяти для контейнера управляющей программы LLAP зависит от следующих факторов:

  • конфигурации для размера контейнера YARN (yarn.scheduler.minimum-allocation-mb, yarn.scheduler.maximum-allocation-mb, yarn.nodemanager.resource.memory-mb);
  • числа мастер-приложений Tez на узле;
  • общего объема памяти, настроенного для всех контейнеров на узле, и емкости очереди LLAP.

Память, необходимая для мастер-приложений Tez (Tez AM), может быть рассчитана следующим образом.
Tez AM выступает в качестве координатора запросов, и количество Tez AMs должно быть настроено на основе множества параллельных запросов, которые будут обслуживаться. Теоретически мы можем рассмотреть один Tez AM на каждый рабочий узел. Однако возможно, что на рабочем узле может отображаться несколько Tez AM. Для целей вычисления предполагается равномерное распределение Tez AM по всем узлам управляющей программы LLAP и рабочим узлам. Для каждого мастер-приложения Tez рекомендуется выделить 4 ГБ памяти.

Число Tez AM = значение, заданное в файле конфигурации Hive hive.server2.tez.sessions.per.default.queue.
Число узлов управляющей программы LLAP задается переменной среды num_llap_nodes_for_llap_daemons в пользовательском интерфейсе Ambari.
Размер контейнера Tez AM = значение, заданное в файле конфигурации tez.am.resource.memory.mb.

Tez AM memory per node = (ceil(Number of Tez AMs / Number of LLAP daemon nodes)x Tez AM container size****
Для D14 v2 конфигурация по умолчанию имеет четыре мастер-приложения Tez и четыре узла управляющей программы LLAP.
Память мастер-приложения на узел = (округление до большего (4/4) x 4 ГБ) = 4 ГБ

Общий объем доступной памяти для очереди LLAP на каждый рабочий узел можно вычислить следующим образом.
Это значение зависит от общего объема памяти, доступного для всех контейнеров YARN на узле (yarn.nodemanager.resource.memory-mb) и процент емкости, настроенной для очереди LLAP(yarn.scheduler.capacity.root.llap.capacity).
Общая память для очереди LLAP на рабочем узле = общая память, доступная для всех контейнеров YARN на узле x Процент емкости для очереди LLAP.
Для D14 v2 это значение составляет (100 ГБ x 0,85) = 85 ГБ.

Размер контейнера управляющей программы LLAP вычисляется следующим образом.

Размер контейнера управляющей программы LLAP = (общий объем памяти для очереди LLAP на рабочем узле) — (память Tez AM на узел) — (размер контейнера master службы)
В кластере, порожденном на одном из рабочих узлов, существует только одна мастер-служба (мастер-приложение для службы LLAP). Для целей вычисления мы рассмотрим одну мастер-службу на каждый рабочий узел.
Для рабочего узла D14 v2 с HDI 4.0 рекомендуется значение (85 ГБ – 4 ГБ – 1 ГБ) = 80 ГБ

8. Определение количества исполнителей на управляющей программе LLAP

Конфигурация: hive.llap.daemon.num.executors, hive.llap.io.threadpool.size

hive.llap.daemon.num.executors:
Этот параметр управляет количеством исполнителей, которые могут выполнять задачи параллельно, для каждой управляющей программы LLAP. Это значение зависит от числа виртуальных ядер, объема памяти, использованного каждым исполнителем, и общего объема памяти, доступного для контейнера управляющей программы LLAP. Количество исполнителей в подписке можно увеличить до 120% от доступных виртуальных ядер на каждый рабочий узел. Однако его следует скорректировать, если оно не соответствует требованиям к памяти в зависимости от объема памяти, необходимой для каждого исполнителя и размера контейнера управляющей программы LLAP.

Каждый исполнитель эквивалентен контейнеру Tez и может потреблять 4 ГБ памяти (размер контейнера Tez). Все исполнители в управляющей программе LLAP совместно используют одну и ту же память кучи. Предполагая, что не все исполнители выполняют операции с интенсивным использованием памяти одновременно, можно рассмотреть 75% размера контейнера Tez (4 ГБ) для каждого исполнителя. Таким образом можно увеличить количество исполнителей, предоставив каждому исполнителю меньше памяти (например, 3 ГБ) для повышения параллельности. Однако рекомендуется настроить этот параметр под целевую рабочую нагрузку.

На виртуальных машинах D14 v2 имеется 16 виртуальных ядер. Для D14 версии 2 рекомендуемое значение для числа исполнителей — (16 виртуальных ядер x 120 %) ~= 19 на каждом рабочем узле с учетом 3 ГБ на исполнителя.

hive.llap.io.threadpool.size:
Это значение задает размер пула потоков для исполнителей. Так как количество исполнителей зафиксировано в соответствии с заданным параметром, значение совпадает с количеством исполнителей на управляющую программу LLAP.
Для D14 v2 рекомендуется значение 19.

9. Определение размера кэша управляющей программы LLAP

Конфигурация: hive.llap.io.memory.size

Память контейнера управляющей программы LLAP состоит из следующих компонентов:

  • запас;
  • Память кучи, используемая исполнителями (Xmx)
  • кэш в памяти на каждую управляющую программу (емкость вне кучи; неприменимо, если включен кэш SSD);
  • пространство для метаданных кэша в памяти (применяется, только если включен кэш SSD).

Размер головного пространства: этот размер указывает часть памяти вне кучи, используемую для затрат на виртуальную машину Java (метапространство, потоки gc , структуры данных и т. д.). Как правило, на эти служебные данные приходится около 6 % от размера кучи (Xmx). Для большей уверенности это значение можно принять равным 6 % от общего объема памяти управляющей программы LLAP.
Для D14 v2 рекомендуемым значением является ceil(80 ГБ x 0,06) ~= 4 ГБ.

Размер кучи (Xmx): объем памяти кучи, доступный для всех исполнителей. Общий объем памяти кучи = Количество исполнителей x 3 ГБ
Для D14 v2 это значение составляет 19 x 3 ГБ = 57 ГБ

Ambari environment variable for LLAP heap size:

`LLAP heap size`.

Если кэш SSD отключен, для кэша в памяти будет выделен объем памяти, оставшийся после вычитания размеров запаса и кучи из размера контейнера управляющей программы LLAP.

При включенном кэше SSD размер кэша вычисляется иначе. Задание hive.llap.io.allocator.mmap = true включает кэширование SSD. Если кэш SSD включен, часть памяти будет использоваться для хранения его метаданных. Метаданные хранятся в памяти, а их объем должен составлять около 8 % от размера кэша SSD.
Размер метаданных кэша SSD в памяти = Размер контейнера управляющей программы LLAP – (Запас + Размер кучи)
Для D14 v2 с HDI 4.0 размер метаданных кэша SSD в памяти = 80 ГБ – (4 ГБ + 57 ГБ) = 19 ГБ

Исходя из размера доступной памяти для хранения метаданных кэша SSD, можно вычислить поддерживаемый размер кэша SSD.
Размер метаданных кэша SSD в памяти = Размер контейнера управляющей программы LLAP – (Запас + Размер кучи) = 19 ГБ
Размер кэша SSD = Размер метаданных в памяти для кэша SSD (19 ГБ) / 0,08 (8 процентов)

Для D14 v2 и HDI 4.0 рекомендуемый размер кэша SSD = 19 ГБ / 0.08 ~= 237 ГБ

10. Настройка памяти соединения карты

Конфигурация: hive.auto.convert.join.noconditionaltask.size

Чтобы этот параметр имел силу, необходимо активировать параметр hive.auto.convert.join.noconditionaltask. Эта конфигурация определяет пороговое значение выбора MapJoin оптимизатором Hive, который считает превышение объема памяти от других исполнителей, чтобы иметь больше места для хэш-таблиц в памяти, чтобы разрешить больше преобразований соединения карты. Учитывая 3 ГБ на исполнителя, этот размер может быть превышен до 3 ГБ, но некоторые кучи памяти также могут использоваться для буферов сортировки, буферов перетасовки и т. д. другими операциями.
Поэтому для D14 версии 2 с 3 ГБ памяти для каждого исполнителя рекомендуется задать для этого значения значение 2048 МБ.

(Примечание. Возможно, это значение потребуется скорректировать под вашу рабочую нагрузку. При слишком низком значении функцию автопреобразования использовать невозможно. Если же значение слишком велико, это может привести к исключениям из-за нехватки памяти или приостановке сборки мусора, что может вызвать снижение производительности.)

11. Количество управляющих программ LLAP

Переменные среды Ambari: num_llap_nodes, num_llap_nodes_for_llap_daemons

num_llap_nodes — указывает количество узлов, используемых службой Hive LLAP, включая узлы под управлением управляющей программы LLAP, мастер-службы LLAP и мастер-приложения Tez (Tez AM).

`Number of Nodes for LLAP service`.
num_llap_nodes_for_llap_daemons — указанное количество узлов, используемое только для управляющих программ LLAP. Размеры контейнеров управляющей программы LLAP устанавливаются в максимальный размер узла, поэтому он приводит к одному llap управляющей программе на каждом узле.

`Number of Nodes for LLAP daemons`.

Рекомендуется, чтобы оба значения совпадали с количеством рабочих узлов в кластере интерактивных запросов.

Рекомендации по управлению рабочей нагрузкой

Если вы хотите включить управление рабочей нагрузкой для LLAP, убедитесь, что зарезервировано достаточное количество ресурсов, чтобы управление рабочей нагрузкой выполнялось согласно ожиданиям. Для управления рабочей нагрузкой требуется настройка пользовательской очереди YARN, которая является дополнением к очереди llap. Убедитесь, что общая емкость ресурсов кластера распределяются между очередью и очередью управления рабочими нагрузками в соответствии с llap требованиями рабочей нагрузки. При активации плана ресурсов управление рабочей нагрузкой порождает мастер-приложения Tez (Tez AM).

Примечание.

  • Tez AM, порожденные путем активации плана ресурсов, расходуют ресурсы из очереди управления рабочей нагрузкой, как указано с помощью hive.server2.tez.interactive.queue.
  • Число Tez AM будет зависеть от значения QUERY_PARALLELISM, указанного в плане ресурсов.
  • После активного управления рабочей нагрузкой Tez AMs в очереди LLAP не будет использоваться. Для координации запросов используются только Tez AM из очереди управления рабочей нагрузкой. Tez AM в очереди llap используются при отключении управления рабочей нагрузкой.

Например: общая емкость кластера = 100 ГБ памяти, разделенная между LLAP, управлением рабочей нагрузкой и очередями по умолчанию, следующим образом:

  • Емкость очереди LLAP = 70 ГБ
  • Емкость очереди управления рабочей нагрузкой = 20 ГБ
  • Емкость очереди по умолчанию = 10 ГБ

С 20 ГБ в емкости очереди управления рабочими нагрузками план ресурсов может указать QUERY_PARALLELISM значение как пять, что означает, что управление рабочими нагрузками может запускать пять Tez AMs с размером 4 ГБ контейнера каждый. Если значение QUERY_PARALLELISM превышает емкость, некоторые Tez AM перестанут отвечать в состоянии ACCEPTED. Сервер Hive 2 Interactive не может отправлять фрагменты запросов на виртуальные машины Tez, которые не находятся в RUNNING состоянии.

Дальнейшие действия

Если проблему не удалось устранить путем настройки этих значений, воспользуйтесь следующими ресурсами.