7 приемов оптимизации SQL-запросов в Apache Hive с движком Tez

Автор Категория ,
7 приемов оптимизации SQL-запросов в Apache Hive с движком Tez

Для обучения дата-инженеров и аналитиков данных, сегодня рассмотрим приемы оптимизации SQL-запросов в Apache Hive, выполняемых движком Tez. Каким образом Tez рассчитывает оптимальное количество редукторов, зачем включать индексацию фильтров, как статистика таблицы помогает улучшить план выполнения запросов и что за конфигурации нужно менять.

3 движка выполнения запросов в Apache Hive

Напомним, в популярном NoSQL-хранилище Apache Hive,  которое реализует возможность обращения к данным в Hadoop HDFS как к SQL-таблицам, есть 3 движка выполнения запросов:

  • MapReduce – изначальный механизм. Он работает медленнее других, преобразуя каждый запрос в задания MapReduce, которые отправляются в контейнеры YARN. Это преобразование занимает довольно много времени.
  • Tez – чтобы решить эту проблему низкой скорости MapReduce, в Hive 0.13 был представлен этот механизм запросов. Tez использует направленные ациклические графы (DAG, Directed Acyclic Graph) для обработки запросов вместо заданий MapReduce. Это снижает задержку и улучшает время ответа на запрос. Подробнее об этом мы писали здесь.
  • Spark – сегодня этот вычислительный движок считается одним из самых популярных фреймворков разработки приложений для аналитики больших данных, который включает множество возможностей, от поддержки ANSI SQL в пакетном и потоковом режиме до моделей машинного обучения и графовых алгоритмов. Как и Tez, Spark тоже использует концепцию DAG для выполнения программы и работает на порядок быстрее классического MapReduce, выполняя операции в оперативной памяти.

Таким образом, первым шагом по повышению производительности Apache Hive является переключение с механизма MapReduce на Spark или Tez. Какие еще приемы помогут движку Tez увеличить скорость выполнения SQL-запросов в Apache Hive, мы рассмотрим далее.

Как повысить скорость Apache Tez: еще 6 приемов

Одним из способов повысить производительность Apache Tez является регулирование количества редукторов, которые выполняют операцию свертки (шаг Reducer в распределенных вычислениях по модели MapReduce).  По умолчанию Tez сам определяет, сколько Reducer’ов использовать для запроса, в зависимости от количества обрабатываемых байтов данных. Можно переопределить это, задав постоянное число. Однако, постоянное количество редукторов не является оптимальным для всех случаев: придется менять количество исполнителей для каждого запроса и проверять производительность методом перебора. Также по мере изменения объема данных это значение также будет меняться.

Для управления количеством Reducer’ов движок Tez использует параметр конфигурации mapred.reduce.tasks. По умолчанию для этого параметра установлено значение -1, когда Tez динамически контролирует количество исполнителей. Tez рассчитывает оптимальное количество редукторов по следующей формуле:

Max(1, Min(hive.exec.reducers.max, ReducerStage estimate/hive.exec.reducers.byte.per.reducer)) x hive.tez.max.partition.factor

Вместо того, чтобы использовать постоянное количество исполнителей, можно включить оптимизацию и векторизацию на основе затрат (CBO, Cost-Based Optimization), а также вычислить статистику таблицы (количество строк, столбцов и пр.), чтобы движок мог создать более оптимальные планы выполнения (логический и физический).

Статистику по таблице поможет оптимизировать производительность некоторых запросов агрегации. Если для таблицы доступна статистика, Tez использует ее для изменения логического и физического плана выполнения, чтобы оптимизировать чтение и вычисления. Рассчитать необходимую статистику поможет команда: analyze table <table_name> compute statistics.

Чтобы оптимизатор HiveQL-запросов мог использовать эту статистику для оптимизации производительности, следует установить конфигурацию hive.compute.query.using.stats в значение true: set hive.compute.query.using.stats=true.

Еще одним приемом является индексация фильтров с партиционированием таблиц Hive для физического разделения данных на основе значений одного или нескольких столбцов. Это уменьшает объем данных, которые должны быть обработаны. Поэтому рекомендуется использовать разделы и использовать условия WHERE в SQL-запросах для фильтрации данных в них. А индексация фильтров дополнительно повысит производительность выполнения запросов, т.к. индексы упорядочивают данные таблиц, оптимизируя время поиска благодаря переходу по упорядоченному массиву.  Чтобы включить индексацию фильтров в Hive, нужно установить параметр конфигурации hive.optimize.index.filter в значение true: set hive.optimize.index.filter=true.

Первым этапом HiveQL-запроса является сопоставление данных. Но для некоторых простых SQL-запросов на выборку данных, например, select *, select *… limit 10 и т. д., сопоставлять особо нечего. С такими запросами можно напрямую получать данные из источника и применять ограничения или фильтры. Для этого Hive следует включить конфигурацию hive.fetch.task.conversion, установив ее в значение more: set hive.fetch.task.conversion=more.

Включение векторизации улучшит производительность запросов агрегации, сканирования, объединения, фильтрации и пр. за счет выполнения этих операций пакетами по 1024 строки вместо построчного выполнения. Для этого есть два параметра конфигурации:

set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;

Наконец, для повышения скорости выполнения SQL-запросов в Apache Hive можно включить оптимизацию на основе затрат, которая по умолчанию отключена. Включение этого параметра сообщает Tez, что логический и физический план каждого запроса необходимо оптимизировать с учетом стоимости запроса, прежде чем отправлять его на выполнение. Включение CBO заставит Tez придумать другой план по снижению стоимости запроса. Это повлияет на степень параллелизма для запроса, тип соединения, способ применения этого соединения и многое другое. Чтобы включить CBO, сначала нужно вычислить статистику по таблице, используя ранее указанную команду. После вычисления статистики можно включить следующие параметры конфигурации для применения CBO к запросам:

set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;

Получите практические навыки администрирования и эксплуатации Apache Hive для аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://blog.contactsunny.com/data-science/understanding-apache-hive-llap
  2. https://blog.contactsunny.com/data-science/optimising-hive-queries-with-tez-query-engine