Не удается применить динамическое секционирование для огромного набора данных в 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 варианта, как я вижу

  1. измените свою работу, чтобы вставить только несколько разделы одновременно.
  2. подождите, пока Hive 13 будет выпущен, и попробуйте это (2-3 месяца ждать).
  3. если вы знаете как построить улей из багажника и использовать его для завершения загрузки данных.