Я постараюсь дать вам несколько советов по улучшению производительности запросов в Hive.
- Проверьте используемый вами механизм выполнения
set hive.execution.engine;
Если вы используете механизм выполнения Если вы используете mr, то вместо MapReduce вы можете использовать Apache Spark или Apache Tez, которые работают быстрее, чем MapReduce.
set hive.execution.engine=tez;
- Запросы на соединение являются вычислительно дорогими и могут быть медленными, особенно когда вы объединяете три или более таблиц или работаете с очень большими данными.
Одна из стратегий, которую можно использовать для решения этой проблемы, - это заранее объединить данные и сохранить предварительно объединенный результат в отдельной таблице, которую можно затем запросить. это один из способов денормализации нормализованной базы данных, чтобы упростить выполнение аналитических c запросов. Такой подход к предварительному объединению таблиц сопряжен с некоторыми затратами, но он может упростить написание аналитических c запросов и ускорить их выполнение.
Существуют и другие методы повышения производительности запросов Hive
- Порядок таблицы соединений (самая большая таблица в прошлом)
Как и при любом типе настройки, он важно понимать внутреннюю работу системы. Когда Hive выполняет соединение, ему нужно выбрать, какая таблица передается в потоковом режиме, а какая таблица кэшируется. Hive берет последнюю таблицу в операторе JOIN для потоковой передачи, поэтому мы должны убедиться, что эта потоковая таблица является самой большой среди двух.
A: 1 миллион B: 700k
Следовательно, когда эти две таблицы объединяются, важно, чтобы таблица большего размера была последней в запросе.
- Bucketing хранит данные в отдельных файлах, а не в отдельных подкаталогах, таких как разделы.
Он делит данные практически случайным образом, а не предсказуемым образом, как разделение. Когда записи вставляются в объединенную таблицу, Hive вычисляет коды ha sh значений в указанном столбце группирования и использует эти коды ha sh для разделения записей на сегменты. По этой причине группирование иногда называют разделением ha sh. Цель группирования - равномерно распределить записи по заранее определенному количеству сегментов. Группирование может улучшить производительность объединений, если все объединенные таблицы объединены в столбец ключа объединения.
Подробнее о объединении см. На странице руководства по языку Hive с описанием таблиц с объединением,
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables?.
https://data-flair.training/blogs/bucketing-in-hive/
Разделение
- Разделение - это способ разделения таблицы на связанные части на основе значений отдельных столбцов, таких как дата, город и отдел.
Каждая таблица в кусте может иметь один или несколько ключей разделов для идентификации конкретного раздела. Используя раздел, можно легко выполнять запросы к фрагментам данных.
https://data-flair.training/blogs/apache-hive-partitions/
Надеюсь, это может быть полезно!
С уважением.