Проблема в Hive Query из-за памяти - PullRequest
1 голос
/ 30 апреля 2019

У нас есть запрос вставки, в котором мы пытаемся вставить данные в многораздельную таблицу путем чтения данных из однораздельной таблицы.

Запрос -

 insert into db1.fact_table PARTITION(part_col1, part_col2) 
 ( col1,
 col2,
 col3,
 col4,
 col5,
 col6,
 .
 .
 .
 .
 .
 .
 .
 col32
 LOAD_DT,
 part_col1,
 Part_col2 ) 
 select 
 col1,
 col2,
 col3,
 col4,
 col5,
 col6,
 .
 .
 .
 .
 .
 .
 .
 col32,
 part_col1,
 Part_col2
 from db1.main_table WHERE col1=0;

В таблице 34 столбца, количество записей в основной таблице зависит от размера входного файла, который мы получаем ежедневно. и количество разделов (part_col1, part_col2), которые мы вставляем в каждый прогон, может варьироваться от 4000 до 5000

Некоторое время этот запрос завершается с ошибкой ниже.

2019-04-28 13: 23: 31,715 Этап-1 = 95%, уменьшение = 0%, кумулятивно ЦП 177220,23 с 2019-04-28 13:24:25,989 Карта этапа 1 = 100%, сокращение = 0%, совокупный процессор 163577,82 сек. MapReduce Общее совокупное время ЦП: 1 день 21 час 26 минут 17 секунд 820 мсек. Завершенное задание = job_1556004136988_155295 с ошибками Ошибка при получении задания отладочная информация ... Проверка идентификатора задачи: task_1556004136988_155295_m_000003 (и более) с работы job_1556004136988_155295 Проверка идентификатора задачи: task_1556004136988_155295_m_000004 (и более) с работы job_1556004136988_155295 Задача с наибольшим количеством сбоев (4): ----- идентификатор задачи: task_1556004136988_155295_m_000000
----- Диагностические сообщения для этой задачи: Исключение из запуска контейнера. Идентификатор контейнера: container_e81_1556004136988_155295_01_000015 Код выхода: стек 255 trace: ExitCodeException exitCode = 255: в org.apache.hadoop.util.Shell.runCommand (Shell.java:563) в org.apache.hadoop.util.Shell.run (Shell.java:460) в org.apache.hadoop.util.Shell $ ShellCommandExecutor.execute (Shell.java:748) в org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.launchContainer (LinuxContainerExecutor.java:305) в org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call (ContainerLaunch.java:356) в org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call (ContainerLaunch.java:88) в java.util.concurrent.FutureTask.run (FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) at java.lang.Thread.run (Thread.java:748) Вывод оболочки: main: предоставлена ​​команда 1 main: пользователь является bldadmin main: запрашиваемый пользователь пряжи - bldadmin Контейнер завершен с ненулевым значением код выхода 255 FAILED: ошибка выполнения, код возврата 2 из org.apache.hadoop.hive.ql.exec.mr.MapRedTask MapReduce Задания запущены: Этап-Этап-1: Карта: 10 Совокупный процессор: 163577,82 сек. Чтение MAPRFS: 0 MAPRFS Запись: 0 FAIL Общее потраченное время MapReduce: 1 день 21 час 26 минут 17 секунд 820 мсек

Текущие свойства улья.

Использование Tez Engine -

set hive.execution.engine=tez;
set hive.tez.container.size=3072;
set hive.tez.java.opts=-Xmx1640m;
set hive.vectorized.execution.enabled=false;
set hive.vectorized.execution.reduce.enabled=false;
set hive.enforce.bucketing=true;
set hive.exec.parallel=true;
set hive.auto.convert.join=false;
set hive.enforce.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;
set hive.optimize.bucketmapjoin=true;
set hive.exec.tmp.maprfsvolume=false;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
set hive.stats.fetch.partition.stats=true;
set hive.support.concurrency=true;
set hive.exec.max.dynamic.partitions=999999999;
set hive.enforce.bucketing=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.compactor.initiator.on=true;

На основании информации, полученной от других команд, мы изменили двигатель на mr и присвоили ему значение -

set hive.execution.engine=mr;
set hive.auto.convert.join=false;
set mapreduce.map.memory.mb=16384;
set mapreduce.map.java.opts=-Xmx14745m;
set mapreduce.reduce.memory.mb=16384;
set mapreduce.reduce.java.opts=-Xmx14745m;

С этими свойствами запрос завершается без ошибок несколько раз.

Как я могу отладить эту проблему и есть ли какие-либо свойства улья, которые мы можем установить, чтобы мы не получили эти проблемы в будущем.

1 Ответ

1 голос
/ 30 апреля 2019

Добавить распространение по ключу раздела.Каждый редуктор будет обрабатывать только один раздел, а не каждый раздел, это приведет к меньшему потреблению памяти, поскольку редуктор будет создавать меньше файлов, сохраняя меньше буферов.

insert into db1.fact_table PARTITION(part_col1, part_col2) 
select 
col1,
...

col32,
part_col1,
Part_col2
 from db1.main_table WHERE col1=0
distribute by part_col1, Part_col2; --add this

Используйте Predicate Push Down, это может помочь с фильтрацией, если исходные файлы имеют ORC:

SET hive.optimize.ppd=true;
SET hive.optimize.ppd.storage=true;
SET hive.optimize.index.filter=true;

Настройка правильного параллелизма преобразователя и преобразователя: https://stackoverflow.com/a/48487306/2700344

Добавьте распределение случайным образом в дополнение к ключам разделов, если ваши данные слишком велики, а распределение по ключам разделов неравномерно.Это поможет с перекосом данных:

distribute by part_col1, Part_col2, FLOOR(RAND()*100.0)%20;

Читайте также https://stackoverflow.com/a/55375261/2700344

...