HIVE: вставка ошибки запроса с ошибкой «java .lang.OutOfMemoryError: G C превышен предел накладных расходов» - PullRequest
0 голосов
/ 16 января 2020

Запрос вставки моего куста завершается с ошибкой: java .lang.OutOfMemoryError: G C превышен предел накладных расходов

Данные в таблице 2 = 1,7 ТБ Запрос:

set hive.exec.dynamic.partition.mode= nonstrict;set hive.exec.dynamic.partition=true;set mapreduce.map.memory.mb=15000;set mapreduce.map.java.opts=-Xmx9000m;set mapreduce.reduce.memory.mb=15000;set mapreduce.reduce.java.opts=-Xmx9000m;set hive.rpc.query.plan=true;
insert into database1.table1 PARTITION(trans_date) select * from database1.table2;

Информация об ошибке: Запуск задания 1 из 1 Количество задач сокращения установлено на 0, поскольку нет оператора сокращения. СБОЙ: Ошибка выполнения, код возврата -101 из org. apache .had oop .hive .ql.exe c .mr.MapRedTask. Превышен предел издержек GC

информация о кластере: общий объем памяти: 1,2 ТБ, всего vcores: всего 288 узлов: версия 8 узлов: 2.7.0-mapr-1808

Обратите внимание : я пытаюсь вставить данные из таблицы 2 в формате паркета в таблицу 1 в формате ИЛИ C. общий объем данных составляет 1,8 ТБ.

1 Ответ

0 голосов
/ 16 января 2020

Добавление распределения по ключу раздела должно решить проблему:

insert into database1.table1 PARTITION(trans_date) select * from database1.table2
distribute by trans_date;

distribute by trans_date запустит шаг редуктора, и каждый редуктор обработает один раздел, что уменьшит нагрузку на память. Когда каждый процесс записывает много разделов, он сохраняет слишком много буферов для ИЛИ C в памяти.

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

set hive.exec.reducers.bytes.per.reducer=67108864; --this is example only, reduce the figure to increase parallelism
...