Не удается применить динамическое секционирование для огромного набора данных в Hive
у меня есть таблица test_details
С 4 млн. записей. Используя данные в этой таблице, я должен создать новую секционированную таблицу test_details_par
с разделением записей на visit_date
. Создание таблицы не является проблемой, но когда я прихожу к той части, где мне нужно вставить данные с помощью динамических разделов, Hive сдается, когда я пытаюсь вставить данные на большее количество дней. Если я делаю это в течение 2 или 3 дней, работа Map Reduce успешно выполняется, но в течение нескольких дней она не дает JAVA Heap Space Error
или GC Error
.
упрощенный снимок моих DDLs выглядит следующим образом:
CREATE TABLE test_details_par( visit_id INT, visit_date DATE, store_id SMALLINT);
INSERT INTO TABLE test_details_par PARTITION(visit_date) SELECT visit_id, store_id, visit_date FROM test_details DISTRIBUTE BY visit_date;
Я попытался установить эти параметры, так что Hive выполняет мою работу лучше:
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions.pernode = 10000;
есть ли что-нибудь, что мне не хватает для запуска вставки для полного пакета без указания дат конкретно?
1 ответов
Нильса,
Hive 12 и ниже имеют известные проблемы масштабируемости с динамическим разбиением, которые будут решаться с помощью Hive 13. Проблема в том, что Hive пытается держать дескриптор файла открытым для каждого раздела, который он записывает, что вызывает нехватку памяти и сбои. Hive 13 будет сортировать по ключу раздела, так что ему нужно только держать один файл открытым за раз.
У вас есть 3 варианта, как я вижу
- измените свою работу, чтобы вставить только несколько разделы одновременно.
- подождите, пока Hive 13 будет выпущен, и попробуйте это (2-3 месяца ждать).
- если вы знаете как построить улей из багажника и использовать его для завершения загрузки данных.