Сокращение карт и редукторов для простого запроса к очень большой таблице / представлению в 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