Оптимизация Apache Hive с помощью Apache Ambari в Azure HDInsight
Apache Ambari — это веб-интерфейс для управления кластерами HDInsight и их мониторинга. Основные сведения о пользовательском веб-интерфейсе Ambari см. в статье Управление кластерами HDInsight с помощью пользовательского веб-интерфейса Apache Ambari.
В следующих разделах описаны параметры конфигурации, используемые для оптимизации общей производительности Apache Hive.
- Чтобы изменить параметры конфигурации Hive, выберите Hive на боковой панели "Services" (Службы).
- Перейдите на вкладку Configs (Конфигурации).
Настройка подсистемы выполнения Hive
Hive предоставляет две подсистемы выполнения: Apache Hadoop MapReduce и Apache Tez. Tez работает быстрее, чем MapReduce. По умолчанию в кластерах HDInsight Linux используется подсистема выполнения Tez. Вот как можно изменить подсистему выполнения.
На вкладке Configs (Конфигурации) Hive в поле фильтра введите execution engine.
Свойство Optimization (Оптимизация) по умолчанию имеет значение Tez.
Настройка модулей сопоставления
Hadoop пытается разделить (сопоставить) отдельный файл на несколько файлов и параллельно обрабатывать эти файлы. Число модулей сопоставления зависит от того, на сколько файлов разделяется файл. Следующие два параметра конфигурации влияют на число разбиений для подсистемы выполнения Tez:
tez.grouping.min-size
: минимальный размер сгруппированного разбиения; значение по умолчанию составляет 16 МБ (16 777 216 байтов);tez.grouping.max-size
: максимальный размер сгруппированного разбиения; значение по умолчанию составляет 1 ГБ (1 073 741 824 байтов).
Для повышения производительности рекомендуется уменьшить значение обоих этих параметров. Это позволит сократить задержку и увеличить пропускную способность.
Например, чтобы задать четыре задачи модуля сопоставления для данных размером в 128 МБ, можно для обоих параметров задать значение 32 МБ (33 554 432 байтов).
Чтобы изменить параметры ограничения, перейдите на вкладку Configs (Конфигурации) службы Tez. Разверните панель General (Общие) и найдите параметры
tez.grouping.max-size
иtez.grouping.min-size
.Задайте для обоих параметров значение 33 554 432 байтов (32 МБ).
Эти изменения влияют на все задания Tez на сервере. Чтобы получить оптимальные результаты, выберите соответствующие значения параметров.
Настройка модулей сжатия
Apache ORC и Snappy обеспечивают высокую производительность. Однако в Hive может использоваться слишком мало модулей сжатия по умолчанию, что может приводить к возникновению узких мест.
Предположим, что имеются входные данные размером в 50 ГБ. В формате ORC с использованием сжатия Snappy эти данные имеют размер 1 ГБ. Hive оценивает необходимое количество редукторов по формуле: (число входных байтов для редукторов / hive.exec.reducers.bytes.per.reducer
).
С параметрами по умолчанию в этом примере используются 4 модуля сжатия.
Параметр hive.exec.reducers.bytes.per.reducer
задает количество байтов, обрабатываемых модулем сжатия. Значение по умолчанию — 64 МБ. Если уменьшить это значение, это увеличит распараллеливание, что может повысить производительность. Слишком маленькое значение может также привести к использованию слишком большого числа модулей сжатия, что может отрицательно повлиять на производительность. Этот параметр зависит от конкретных требований к обработке данных, параметров сжатия и других факторов среды.
Чтобы изменить этот параметр, перейдите на вкладку Configs (Конфигурации) Hive и найдите параметр Data per Reducer (Данные на модуль сжатия) на странице "Settings" (Параметры).
Выберите Edit (Изменить), чтобы изменить значение параметра на 128 МБ (134 217 728 байтов), и нажмите клавишу ВВОД, чтобы сохранить изменение.
При входных данных размером в 1024 МБ и 128 МБ данных на редуктор будут использоваться 8 редукторов (1024/128).
Неправильное значение параметра Data per Reducer (Данные на модуль сжатия) может привести к появлению большого количества модулей сжатия, что отрицательно повлияет на производительность запросов. Чтобы задать максимальное число модулей сжатия, задайте для параметра
hive.exec.reducers.max
соответствующее значение. Значение по умолчанию — 1009.
Включение параллельного выполнения
Запрос Hive выполняется в один или несколько этапов. Если независимые этапы могут выполняться параллельно, это повышает производительность запросов.
Чтобы включить параллельное выполнение запросов, перейдите на вкладку Configs (Конфигурации) и найдите свойство
hive.exec.parallel
. По умолчанию используется значение false. Установите значение true и нажмите клавишу ВВОД, чтобы сохранить изменения.Чтобы ограничить количество заданий, выполняемых параллельно, измените свойство
hive.exec.parallel.thread.number
. Значение по умолчанию — 8.
Включение векторизации
Hive обрабатывает данные построчно. Векторизация указывает Hive обрабатывать данные блоками по 1024 строки, а не по одной строке за раз. Векторизация применима только к формату файлов ORC.
Чтобы включить векторизированное выполнение запросов, перейдите на вкладку Configs (Конфигурации) и найдите параметр
hive.vectorized.execution.enabled
. Для Hive 0.13.0 или более поздних версий значение по умолчанию — true.Чтобы включить векторизированное выполнение сжимаемой части запроса, задайте для параметра
hive.vectorized.execution.reduce.enabled
значение true. По умолчанию используется значение false.
Включение оптимизации с учетом затрат
По умолчанию Hive выполняет набор правил, чтобы найти один оптимальный план выполнения запроса. Оптимизация с учетом затрат (CBO) оценивает несколько планов для выполнения запроса. А затем назначает стоимость каждому плану и определяет самый дешевый план для выполнения запроса.
Чтобы включить CBO, перейдите в раздел Hive > Конфигурации > Параметры и найдите пункт Включить оптимизатор с учетом затрат, а затем установите выключатель в положение Вкл.
Приведенные ниже дополнительные параметры позволяют повысить производительность запросов Hive при использовании оптимизации с учетом затрат.
hive.compute.query.using.stats
Если задано значение true, служба Hive использует статистические данные, хранящиеся в ее метахранилище, для ответа на такие простые запросы, как
count(*)
.hive.stats.fetch.column.stats
Статистика по столбцам создается при включении оптимизации с учетом затрат. Hive использует статистику по столбцам, которая хранится в метахранилище, чтобы оптимизировать запросы. Если столбцов много, то получение статистики по столбцам для каждого из них занимает больше времени. Если задано значение false, этот параметр отключает получение статистики по столбцам из метахранилища.
hive.stats.fetch.partition.stats
Базовая статистика по секциям, например число строк, размер данных и размер файла, хранится в метахранилище. Если задано значение true, то статистика по секциям получается из хранилища метаданных. Если значение равно false, размер файла выбирается из файловой системы. А количество строк извлекается из схемы строки.
Дополнительные сведения см. в записи блога Hive Cost Based Optimization (Оптимизация с учетом стоимости Hive) в блоге об аналитике на базе Azure.
Включение промежуточного сжатия
Задачи сопоставления создают промежуточные файлы, которые используются задачами модуля сжатия. Промежуточное сжатие сокращает размер промежуточных файлов.
Как правило, узким местом заданий Hadoop является ввод-вывод. Сжатие данных может ускорить ввод-вывод и общую передачу данных по сети.
Ниже приведены доступные типы сжатия.
Формат | Средство | Алгоритм | Расширение файла | Возможность разделения |
---|---|---|---|---|
Gzip | Gzip | DEFLATE | .gz |
No |
Bzip2 | Bzip2 | Bzip2 | .bz2 |
Да |
LZO | Lzop |
LZO | .lzo |
Да, при индексации. |
Snappy | Н/П | Snappy | Snappy | No |
Как правило, поддержка методом сжатия разделения важна. В противном случае будет создано мало модулей сопоставления. Если входными данными является текст, то bzip2
является наилучшим вариантом. Для формата ORC наиболее быстрым методом сжатия является Snappy.
Чтобы включить промежуточное сжатие, перейдите на вкладку Configs (Конфигурации) Hive, а затем установите для параметра
hive.exec.compress.intermediate
значение true. По умолчанию используется значение false.Примечание.
Чтобы сжимать промежуточные файлы, выберите кодек сжатия с наименьшими затратами мощности ЦП, даже если этот кодек не обеспечивает высокую степень сжатия.
Чтобы задать кодек промежуточного сжатия, добавьте пользовательское свойство
mapred.map.output.compression.codec
в файлhive-site.xml
илиmapred-site.xml
.Вот как можно добавить пользовательский параметр.
a. Перейдите в раздел Hive > Конфигурации > Расширенные > Настраиваемый сайт Hive.
b. Щелкните ссылку Добавить свойство в нижней части области "Настраиваемый сайт Hive".
c. В окне "Add Property" (Добавление свойства) введите ключ
mapred.map.output.compression.codec
и значениеorg.apache.hadoop.io.compress.SnappyCodec
.d. Выберите Добавить.
Этот параметр позволит сжать промежуточный файл с помощью метода Snappy. После добавления свойство отображается в области "Custom hive-site" (Настраиваемый сайт Hive).
Примечание.
Эта процедура изменяет файл
$HADOOP_HOME/conf/hive-site.xml
.
Сжатие окончательных выходных данных
Окончательные выходные данные Hive также могут быть сжаты.
Чтобы включить сжатие окончательных выходных данных Hive, перейдите на вкладку Configs (Конфигурации) Hive, а затем установите для параметра
hive.exec.compress.output
значение true. По умолчанию используется значение false.Чтобы выбрать кодек для сжатия выходных данных, добавьте пользовательское свойство
mapred.output.compression.codec
в область "Custom hive-site" (Настраиваемый сайт Hive), как описано на шаге 3 в предыдущем разделе.
Включение спекулятивного выполнения
Спекулятивное выполнение запускает определенное количество повторяющихся задач для обнаружения и запрета средства отслеживания медленно выполняющихся задач. При этом улучшается общее качество выполнения заданий за счет оптимизации результатов отдельных задач.
Спекулятивное выполнение не следует включать для длительных задач MapReduce с большим количеством входных данных.
Чтобы включить спекулятивное выполнение, перейдите на вкладку Configs (Конфигурации) Hive, а затем установите для параметра
hive.mapred.reduce.tasks.speculative.execution
значение true. По умолчанию используется значение false.
Настройка динамических секций
Hive позволяет создавать динамические секции при вставке записей в таблицу без предварительного определения каждой секции. Эта возможность представляет собой мощную функцию. Хотя это может привести к созданию большого количества секций. И большого количества файлов для каждой секции.
Чтобы в Hive использовались динамические секции, параметр
hive.exec.dynamic.partition
должен иметь значение true (используется по умолчанию).Измените режим динамических секций на strict (Строгий). В строгом режиме хотя бы одна секция должна быть статической. Этот параметр предотвращает выполнение запросов без фильтра секций в предложении WHERE, то есть строгий режим предотвращает выполнение запросов, которые проверяют все секции. Перейдите на вкладку Configs (Конфигурации) Hive, а затем задайте для параметра
hive.exec.dynamic.partition.mode
значение strict (Строгий). По умолчанию используется значение nonstrict (Нестрогий).Чтобы ограничить число создаваемых динамических секций, измените параметр
hive.exec.max.dynamic.partitions
. По умолчанию используется значение 5000.Чтобы ограничить общее число динамических секций на узел, измените параметр
hive.exec.max.dynamic.partitions.pernode
. По умолчанию используется значение 2000.
Включение локального режима
Локальный режим позволяет Hive выполнять все задачи задания на одном компьютере. А иногда в рамках одного процесса. Этот параметр улучшает производительность запросов, если входные данные невелики. А затраты на запуск задач для запросов составляют значительный процент общего выполнения запроса.
Чтобы включить локальный режим, добавьте параметр hive.exec.mode.local.auto
в область "Custom hive-site" (Настраиваемый сайт Hive), как описано на шаге 3 в разделе Включение промежуточного сжатия.
Настройка отдельного запроса MapReduce MultiGROUP BY
Если это свойство имеет значение true, то запрос MultiGROUP BY с общими ключами group-by создает отдельное задание MapReduce.
Чтобы включить этот режим, добавьте параметр hive.multigroupby.singlereducer
в область "Custom hive-site" (Настраиваемый сайт Hive), как описано на шаге 3 в разделе Включение промежуточного сжатия.
Дополнительные оптимизации Hive
В следующих разделах описаны дополнительные оптимизации Hive, которые можно применить.
Оптимизация соединений
По умолчанию в Hive используется соединение в случайном порядке. В Hive специальные модули сопоставления считывают входные данные и создают пару "ключ-значение" соединения в промежуточном файле. Hadoop сортирует и объединяет эти пары на этапе обработки в случайном порядке. Этот этап обработки в случайном порядке является высокозатратным. Выбор правильного соединения в соответствии с вашими данными может значительно повысить производительность.
Тип соединения | When | Как | Параметры Hive | Комментарии |
---|---|---|---|---|
Соединение в случайном порядке. |
|
|
Не требуется значительная настройка Hive. | Работает каждый раз. |
Соединение с сопоставлением |
|
|
hive.auto.confvert.join=true |
Быстрый метод, но ограниченный |
Сортировка, слияние, объединение | Если обе таблицы:
|
Каждый процесс:
|
hive.auto.convert.sortmerge.join=true |
Эффективность |
Оптимизации подсистемы выполнения
Дополнительные рекомендации по оптимизации подсистемы выполнения Hive.
Параметр | Рекомендуемая конфигурация | Значение по умолчанию HDInsight |
---|---|---|
hive.mapjoin.hybridgrace.hashtable |
True — более безопасное и медленное выполнение, false — более быстрое выполнение. | false |
tez.am.resource.memory.mb |
Верхняя граница составляет 4 ГБ для большинства сценариев. | Автоматическая настройка. |
tez.session.am.dag.submit.timeout.secs |
Более 300 | 300 |
tez.am.container.idle.release-timeout-min.millis |
Более 20 000 | 10000 |
tez.am.container.idle.release-timeout-max.millis |
Более 40 000 | 20000 |