Сокращение карт и редукторов для простого запроса к очень большой таблице / представлению в Hive

У нас есть простой запрос к таблице / представлению размером примерно 5 ТБ. Мы выполняем ETL и, наконец, добавляем данные в основную таблицу, добавляя раздел.

Но поскольку данные, которые мы обрабатываем, огромны, запрос порождает более 4000 мапперов и более 1000 редукторов. Запрос также выполняется в течение 40 минут.

Как я могу улучшить / уменьшить использование ресурсов?

Запрос:

insert overwrite table dss.prblm_mtrc partition (LOAD_DT) select *, '2019-01-02' as LOAD_DT from dss.v_prblm_mtrc_stg_etl

1 ответ

Решение

Используйте статический раздел, если в целевой таблице уже много разделов, Hive будет сканировать их быстрее до окончательной загрузки, см. Также: Советы по динамическому разделению HIVE

insert overwrite table dss.prblm_mtrc partition (LOAD_DT='2019-01-02') select * from dss.v_prblm_mtrc_stg_etl

Если в вашей исходной таблице слишком много маленьких файлов, попробуйте уменьшить их, использовать объединение для файлов orc или использовать слияние при загрузке исходной таблицы.

Используйте векторизацию, настройку мапперов и параллелизм редукторов: /questions/31865237/vyipolnit-hive-query-s-parametrami-predlozheniya-in-parallelno/31865256#31865256

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

Все настройки векторизации здесь.

И если ваша целевая таблица содержит много уже загруженных разделов, попробуйте отключить автоматический сбор статистики, этот параметр может ускорить загрузку:

set hive.stats.autogather=false;

Также, если ваша исходная таблица - orc, а вычисление разбиений занимает слишком много времени, попробуйте этот параметр:

hive.exec.orc.split.strategy=BI;

Подробнее о стратегии ORC: стратегия разделения ORC

Другие вопросы по тегам