5 лайфхаков по Apache Hive для инженера данных и специалиста по Data Science

курсы Hive обучение примеры, курсы NoSQL, обучение дата-инженер, курсы дата-инженер, SQL-on-Hadoop примеры курсы обучение, SQL HDFS Hive курсы примеры, Школа Больших Данных Учебный Центр Коммерсант

Сегодня рассмотрим несколько полезных приемов по работе с Apache Hive, которые пригодятся инженеру данных и специалисту по Data Science в проектах аналитики больших данных. Как разделить и сегментировать таблицы, зачем изменять значение конфигурации памяти этапов MapReduce, чем полезна автоматическая обработка асимметрии данных и еще пара лайфхаков для ускорения выполнения SQL-запросов в Apache Hive.

Место Apache Hive в проектах Data Science

Apache Hive — это популярное NoSQL-хранилище стека SQL-on-Hadoop. Этот SQL-движок на базе экосистемы Hadoop позволяет обращаться к данным, хранящимся в HDFS, через ANSI-подобный язык SQL-запросов без разработки кода с функциями MapReduce. Поскольку каждый Data Scientist знаком с операторами языка структурированных запросов и умеет им пользоваться, чтобы получить из выборки нужные данные, Hive весьма активно используется в различных ML-проектах.

Хотя не каждую аналитическую модель нужно масштабировать для больших данных, в большинстве случаев это приходится делать по мере роста объема обрабатываемой информации. Например, прошлогодняя ML-модель нуждается в повторной калибровке на новых данных, объем которых увеличился в 10 раз по сравнению с предыдущим периодом. Или код генерации фичей должен работать с большим объемом данных, чтобы генерировать те же самые фичи, ранее определенные для небольшой модели. Простой Python-скрипт на локальном сервере уже не справится с таким масштабом.

Рассмотрим пример отбора данных и создания статистически значимой выборки населения, чтобы далее использовать эти данные в Data Science конвейере. При этом необходимо проанализировать весь набор данных, чтобы выяснить, сколько людей ходили в один и тот же ресторан за последние 6 месяцев. В этом случае нельзя полагаться на локальную выборку, чтобы не исключить группу людей, которые важны для дальнейшего анализа. Apache Hive отлично справляется с подобными задачами быстрой обработки огромных объемов данных. Однако, чтобы этот инструмент работал эффективно, следует с самого начала знать несколько полезных приемов аналитической обработки данных, которые мы рассмотрим далее.

Партиционирование данных

Разделение или партиционирование в Hive — это способ разделения таблицы на разные части на основе значения столбца раздела, чтобы ускорить выполнение запросов к срезам данных. Это рекомендуется делать с самого начала. Например, если выполняется анализ данных о потребительской активности, лучше объединить данные за один и добавить раздел для этого дня в таблицу Hive. Для этого можно использовать оператор alter table, чтобы вставить новые данные в Hive-таблицу cons_act в виде раздела:

alter table cons_act add partition(date='20220709') location '/activity/consumer/20220709/';

Выполняя этот шаг ежедневно, чтобы загрузить данные за день в Hive, можно избежать проблем с производительностью. Имея партиционированные данные, можно указать диапазоны дат в условии WHERE в SQL-запросе, чтобы Hive загружал только эти конкретные даты вместо всего диапазона данных. Это уменьшит размер сканируемых данных и время выполнения запроса:

select * from cons_act where date='20220709';
select * from const_act where date >='20220707' and date <='20220709';
select * from cons_act where date like '202207%';
select * from cons_act where date like '2022%';

Настройка памяти на этапы MapReduce

Задания Hive выполняются по вычислительной модели MapReduce, т.е. как набор задач сопоставления и свертки. По умолчанию каждая задача получает фиксированную память на каждый этап. Запустив задания Hive над большими данными, иногда можно столкнуться с тем, что они уничтожаются на этапе сопоставления или свертки с ошибкой нехватки памяти. Чтобы избежать этого, следует изменить значение конфигурации памяти каждого этапа. Например, следующие настройки установят память этапа Map для каждой задачи на 8 ГБ и для Reduce на 10 ГБ:

set mapreduce.map.memory.mb=8000;
set mapreduce.reduce.memory.mb=10000;

Общая память задания Hive ограничена максимальным объемом памяти контейнера, настроенным администратор кластера Hadoop. Если установить значение памяти выше этого предела, задание Hive не запустится, т.к. это запрещено механизмом управления ресурсами Hadoop.

Обработка асимметрии данных в Apache Hive

Перекос или неравномерность данных означает, что отдельные столбцы или ключи в данных имеют больше значений, чем остальные данные. Такая асимметрия часто встречается в наборах больших данных. Например, в данных из онлайн-игры, определенная возрастная группа пользователей будет более активной на платформе. И даже в рамках этой когорты можно выделить группы, более активные в отдельные периоды времени. При обработке таких данных с неравномерным распределением запросы будут выполняться медленнее или давать сбои на этапах свертки, где происходит агрегирование. Например, при агрегации данных об активности пользователей в течение дня путем соединения таблицы почасовой активности с таблицей пользователей. В этом случае рекомендуется настроить конфигурацию hive.optimize.skewjoin, чтобы Hive сам обрабатывал такую ​​асимметрию в соединении:

set hive.optimize.skewjoin=true;

Другой связанный параметр позволит определить количество строк асимметричного ключа, например, если ключ в SQL-запросе (час дня в приведенном выше примере) имеет строки более 60000, то Hive будет рассматривать его как перекос в этой операции соединения и обрабатывать так, чтобы уменьшить задержку задания:

set hive.skewjoin.key=60000;

Соединение таблиц с MapSideJoin

Соединение таблиц считается самой распространенной операцией при выполнении SQL-запросов. Например, данные содержатся в нескольких таблицах, которые нужно соединить по ключу, чтобы выбрать необходимые столбцы из них. Если данные в таблицах неравномерны по размеру, пригодится оператор  MapJoin, о котором мы подробно писали здесь. Эта операция пригодится для соединения на таблиц, одна из которых является небольшой, а другая – наоборот, очень объемной. Размер маленькой таблицы устанавливается через свойство hive.Mapjoin.smalltable.filsize. Если файл таблицы весит меньше значения в МБ, указанного в свойстве hive.Mapjoin.smalltable.filsize, то таблица считается маленькой. Иначе – наоборот, большой. По умолчанию значение свойства hive.Mapjoin.smalltable.filsize равно 25 МБ.

Например, указать меньшую из таблиц для соединения MapJoin можно следующим образом:

set hive.auto.convert.join=true;
select user_details.user_name, user_details.user_age, hourly_act.num_of_games, hourly_act.active_min 
from user_details join hourly_act on user_details.userid = hourly_act.user_id;

В этом SQL-запросе таблица user_details считается небольшой и содержит некоторые данные о пользователе (идентификатор, имя и возраст), а в большой таблице hourly activity будут записи о почасовой активности всех пользователей в любое время дня. Установка конфигурации hive.auto.convert.join в значение true указывает Hive на перенос таблицы user_details в память, что ускоряет выполнение запроса.

Дополнительно можно оптимизировать подобный запрос, применив бакетирование (bucketing) —метод организации таблиц или разделов в блоки данных. Это наиболее эффективно для выборки данных, а соединение 2-х таблиц, которые группируются по одним и тем же столбцам, может быть реализовано MapJoin сегментов (бакетов). В этом случае Mapper, работающий с сегментом левой таблицы, для выполнения соединения должен загрузить только соответствующие сегменты правой таблицы. Обычно это работает лучше всего, если таблицы разделены по соединяемому столбцу и отсортированы по этому столбцу, потому что тогда сортировка слиянием становится эффективной. Подробнее про бакетирование и партиционирование таблиц Hive мы писали здесь.

Тайм-аут задачи

Еще один важный параметр при работе с большими данными — тайм-аут на уровне задач MapReduce. Этот параметр особенно важен при выполнении SQL-запросов с условиями WHERE и GROUP BY. Запросы такого типа в сочетании с проблемами асимметрии данных иногда приводят к тому, что некоторые задачи MapReduce выполняются очень долго. Это приводит к тому, что выполняющаяся задача пропускает heartbeat-сообщение мастеру приложения, т.е. главному узлу, который наблюдает за состоянием задач всего кластера Hive. Мастер ожидает heartbeat-сообщений от узлов кластера каждые 10 минут (значение по умолчанию 600000 миллисекунд). Если этого недостаточно, можно установить большее значение для конфигурации mapred.task.timeout, например 3600000 миллисекунд, т.е. 30 мин:

set mapred.task.timeout=3600000;

Это гарантирует, что каждая задача в Hive-задании может выполняться в течение 30 минут, прежде чем она отправит heartbeat-сообщение мастеру приложения. Это гарантирует, что задание не будет уничтожено из-за того, что это сообщение не доходит до мастера приложения каждые 10 минут, а продолжает ожидать увеличенный период времени (тайм-аут) в 30 минут перед завершением.

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

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

Источники

  1. https://pub.towardsai.net/apache-hive-hacks-for-a-data-scientist-part-i-e406ad11b937
  2. https://blog.devgenius.io/hive-query-optimization-on-an-amazon-dataset-2e36fd5f0d8a
Поиск по сайту