Бөлісу құралы:


Оптимизация Apache Hive с помощью Apache Ambari в Azure HDInsight

Apache Ambari — это веб-интерфейс для управления кластерами HDInsight и их мониторинга. Основные сведения о пользовательском веб-интерфейсе Ambari см. в статье Управление кластерами HDInsight с помощью пользовательского веб-интерфейса Apache Ambari.

В следующих разделах описаны параметры конфигурации, используемые для оптимизации общей производительности Apache Hive.

  1. Чтобы изменить параметры конфигурации Hive, выберите Hive на боковой панели "Services" (Службы).
  2. Перейдите на вкладку Configs (Конфигурации).

Настройка подсистемы выполнения Hive

Hive предоставляет две подсистемы выполнения: Apache Hadoop MapReduce и Apache Tez. Tez работает быстрее, чем MapReduce. По умолчанию в кластерах HDInsight Linux используется подсистема выполнения Tez. Вот как можно изменить подсистему выполнения.

  1. На вкладке Configs (Конфигурации) Hive в поле фильтра введите execution engine.

    Apache Ambari Search execution engine.

  2. Свойство Optimization (Оптимизация) по умолчанию имеет значение Tez.

    Optimization - Apache Tez engine.

Настройка модулей сопоставления

Hadoop пытается разделить (сопоставить) отдельный файл на несколько файлов и параллельно обрабатывать эти файлы. Число модулей сопоставления зависит от того, на сколько файлов разделяется файл. Следующие два параметра конфигурации влияют на число разбиений для подсистемы выполнения Tez:

  • tez.grouping.min-size: минимальный размер сгруппированного разбиения; значение по умолчанию составляет 16 МБ (16 777 216 байтов);
  • tez.grouping.max-size: максимальный размер сгруппированного разбиения; значение по умолчанию составляет 1 ГБ (1 073 741 824 байтов).

Для повышения производительности рекомендуется уменьшить значение обоих этих параметров. Это позволит сократить задержку и увеличить пропускную способность.

Например, чтобы задать четыре задачи модуля сопоставления для данных размером в 128 МБ, можно для обоих параметров задать значение 32 МБ (33 554 432 байтов).

  1. Чтобы изменить параметры ограничения, перейдите на вкладку Configs (Конфигурации) службы Tez. Разверните панель General (Общие) и найдите параметры tez.grouping.max-size и tez.grouping.min-size.

  2. Задайте для обоих параметров значение 33 554 432 байтов (32 МБ).

    Apache Ambari Tez grouping sizes.

Эти изменения влияют на все задания Tez на сервере. Чтобы получить оптимальные результаты, выберите соответствующие значения параметров.

Настройка модулей сжатия

Apache ORC и Snappy обеспечивают высокую производительность. Однако в Hive может использоваться слишком мало модулей сжатия по умолчанию, что может приводить к возникновению узких мест.

Предположим, что имеются входные данные размером в 50 ГБ. В формате ORC с использованием сжатия Snappy эти данные имеют размер 1 ГБ. Hive оценивает необходимое количество редукторов по формуле: (число входных байтов для редукторов / hive.exec.reducers.bytes.per.reducer).

С параметрами по умолчанию в этом примере используются 4 модуля сжатия.

Параметр hive.exec.reducers.bytes.per.reducer задает количество байтов, обрабатываемых модулем сжатия. Значение по умолчанию — 64 МБ. Если уменьшить это значение, это увеличит распараллеливание, что может повысить производительность. Слишком маленькое значение может также привести к использованию слишком большого числа модулей сжатия, что может отрицательно повлиять на производительность. Этот параметр зависит от конкретных требований к обработке данных, параметров сжатия и других факторов среды.

  1. Чтобы изменить этот параметр, перейдите на вкладку Configs (Конфигурации) Hive и найдите параметр Data per Reducer (Данные на модуль сжатия) на странице "Settings" (Параметры).

    Apache Ambari Data per Reducer.

  2. Выберите Edit (Изменить), чтобы изменить значение параметра на 128 МБ (134 217 728 байтов), и нажмите клавишу ВВОД, чтобы сохранить изменение.

    Ambari Data per Reducer - edited.

    При входных данных размером в 1024 МБ и 128 МБ данных на редуктор будут использоваться 8 редукторов (1024/128).

  3. Неправильное значение параметра Data per Reducer (Данные на модуль сжатия) может привести к появлению большого количества модулей сжатия, что отрицательно повлияет на производительность запросов. Чтобы задать максимальное число модулей сжатия, задайте для параметра hive.exec.reducers.max соответствующее значение. Значение по умолчанию — 1009.

Включение параллельного выполнения

Запрос Hive выполняется в один или несколько этапов. Если независимые этапы могут выполняться параллельно, это повышает производительность запросов.

  1. Чтобы включить параллельное выполнение запросов, перейдите на вкладку Configs (Конфигурации) и найдите свойство hive.exec.parallel. По умолчанию используется значение false. Установите значение true и нажмите клавишу ВВОД, чтобы сохранить изменения.

  2. Чтобы ограничить количество заданий, выполняемых параллельно, измените свойство hive.exec.parallel.thread.number. Значение по умолчанию — 8.

    Apache Hive exec parallel display.

Включение векторизации

Hive обрабатывает данные построчно. Векторизация указывает Hive обрабатывать данные блоками по 1024 строки, а не по одной строке за раз. Векторизация применима только к формату файлов ORC.

  1. Чтобы включить векторизированное выполнение запросов, перейдите на вкладку Configs (Конфигурации) и найдите параметр hive.vectorized.execution.enabled. Для Hive 0.13.0 или более поздних версий значение по умолчанию — true.

  2. Чтобы включить векторизированное выполнение сжимаемой части запроса, задайте для параметра hive.vectorized.execution.reduce.enabled значение true. По умолчанию используется значение false.

    Apache Hive vectorized execution.

Включение оптимизации с учетом затрат

По умолчанию Hive выполняет набор правил, чтобы найти один оптимальный план выполнения запроса. Оптимизация с учетом затрат (CBO) оценивает несколько планов для выполнения запроса. А затем назначает стоимость каждому плану и определяет самый дешевый план для выполнения запроса.

Чтобы включить CBO, перейдите в раздел Hive > Конфигурации > Параметры и найдите пункт Включить оптимизатор с учетом затрат, а затем установите выключатель в положение Вкл.

HDInsight cost-based optimizer.

Приведенные ниже дополнительные параметры позволяют повысить производительность запросов Hive при использовании оптимизации с учетом затрат.

  • hive.compute.query.using.stats

    Если задано значение true, служба Hive использует статистические данные, хранящиеся в ее метахранилище, для ответа на такие простые запросы, как count(*).

    Apache Hive compute query using stats.

  • hive.stats.fetch.column.stats

    Статистика по столбцам создается при включении оптимизации с учетом затрат. Hive использует статистику по столбцам, которая хранится в метахранилище, чтобы оптимизировать запросы. Если столбцов много, то получение статистики по столбцам для каждого из них занимает больше времени. Если задано значение false, этот параметр отключает получение статистики по столбцам из метахранилища.

    Apache Hive stats set column stats.

  • hive.stats.fetch.partition.stats

    Базовая статистика по секциям, например число строк, размер данных и размер файла, хранится в метахранилище. Если задано значение true, то статистика по секциям получается из хранилища метаданных. Если значение равно false, размер файла выбирается из файловой системы. А количество строк извлекается из схемы строки.

    Hive stats set partition stats.

Дополнительные сведения см. в записи блога 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.

  1. Чтобы включить промежуточное сжатие, перейдите на вкладку Configs (Конфигурации) Hive, а затем установите для параметра hive.exec.compress.intermediate значение true. По умолчанию используется значение false.

    `Hive exec compress intermediate`.

    Примечание.

    Чтобы сжимать промежуточные файлы, выберите кодек сжатия с наименьшими затратами мощности ЦП, даже если этот кодек не обеспечивает высокую степень сжатия.

  2. Чтобы задать кодек промежуточного сжатия, добавьте пользовательское свойство mapred.map.output.compression.codec в файл hive-site.xml или mapred-site.xml.

  3. Вот как можно добавить пользовательский параметр.

    a. Перейдите в раздел Hive > Конфигурации > Расширенные > Настраиваемый сайт Hive.

    b. Щелкните ссылку Добавить свойство в нижней части области "Настраиваемый сайт Hive".

    c. В окне "Add Property" (Добавление свойства) введите ключ mapred.map.output.compression.codec и значение org.apache.hadoop.io.compress.SnappyCodec.

    d. Выберите Добавить.

    `Apache Hive custom property add`.

    Этот параметр позволит сжать промежуточный файл с помощью метода Snappy. После добавления свойство отображается в области "Custom hive-site" (Настраиваемый сайт Hive).

    Примечание.

    Эта процедура изменяет файл $HADOOP_HOME/conf/hive-site.xml.

Сжатие окончательных выходных данных

Окончательные выходные данные Hive также могут быть сжаты.

  1. Чтобы включить сжатие окончательных выходных данных Hive, перейдите на вкладку Configs (Конфигурации) Hive, а затем установите для параметра hive.exec.compress.output значение true. По умолчанию используется значение false.

  2. Чтобы выбрать кодек для сжатия выходных данных, добавьте пользовательское свойство mapred.output.compression.codec в область "Custom hive-site" (Настраиваемый сайт Hive), как описано на шаге 3 в предыдущем разделе.

    Apache Hive custom property add2.

Включение спекулятивного выполнения

Спекулятивное выполнение запускает определенное количество повторяющихся задач для обнаружения и запрета средства отслеживания медленно выполняющихся задач. При этом улучшается общее качество выполнения заданий за счет оптимизации результатов отдельных задач.

Спекулятивное выполнение не следует включать для длительных задач MapReduce с большим количеством входных данных.

  • Чтобы включить спекулятивное выполнение, перейдите на вкладку Configs (Конфигурации) Hive, а затем установите для параметра hive.mapred.reduce.tasks.speculative.execution значение true. По умолчанию используется значение false.

    `Hive mapred reduce tasks speculative execution`.

Настройка динамических секций

Hive позволяет создавать динамические секции при вставке записей в таблицу без предварительного определения каждой секции. Эта возможность представляет собой мощную функцию. Хотя это может привести к созданию большого количества секций. И большого количества файлов для каждой секции.

  1. Чтобы в Hive использовались динамические секции, параметр hive.exec.dynamic.partition должен иметь значение true (используется по умолчанию).

  2. Измените режим динамических секций на strict (Строгий). В строгом режиме хотя бы одна секция должна быть статической. Этот параметр предотвращает выполнение запросов без фильтра секций в предложении WHERE, то есть строгий режим предотвращает выполнение запросов, которые проверяют все секции. Перейдите на вкладку Configs (Конфигурации) Hive, а затем задайте для параметра hive.exec.dynamic.partition.mode значение strict (Строгий). По умолчанию используется значение nonstrict (Нестрогий).

  3. Чтобы ограничить число создаваемых динамических секций, измените параметр hive.exec.max.dynamic.partitions. По умолчанию используется значение 5000.

  4. Чтобы ограничить общее число динамических секций на узел, измените параметр hive.exec.max.dynamic.partitions.pernode. По умолчанию используется значение 2000.

Включение локального режима

Локальный режим позволяет Hive выполнять все задачи задания на одном компьютере. А иногда в рамках одного процесса. Этот параметр улучшает производительность запросов, если входные данные невелики. А затраты на запуск задач для запросов составляют значительный процент общего выполнения запроса.

Чтобы включить локальный режим, добавьте параметр hive.exec.mode.local.auto в область "Custom hive-site" (Настраиваемый сайт Hive), как описано на шаге 3 в разделе Включение промежуточного сжатия.

Apache Hive exec mode local auto.

Настройка отдельного запроса MapReduce MultiGROUP BY

Если это свойство имеет значение true, то запрос MultiGROUP BY с общими ключами group-by создает отдельное задание MapReduce.

Чтобы включить этот режим, добавьте параметр hive.multigroupby.singlereducer в область "Custom hive-site" (Настраиваемый сайт Hive), как описано на шаге 3 в разделе Включение промежуточного сжатия.

Hive set single MapReduce MultiGROUP BY.

Дополнительные оптимизации 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

Следующие шаги