无法对Hive中的大型数据集应用动态分区

Nee*_*els 8 hadoop hive

我有一张test_details包含大约400万条记录的表格.使用此表中的数据,我必须创建一个分区test_details_par记录的新分区表visit_date.创建表并不是一个挑战,但是当我来到我必须使用动态分区来插入数据的部分时,当我尝试插入数据更多天时,Hive放弃了.如果我这样做2或3天,Map Reduce作业会成功运行,但是在更多天内它没有给出一个JAVA Heap Space Error或者GC Error.

我的DDL的简化快照如下:

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;
Run Code Online (Sandbox Code Playgroud)

有没有什么我缺少运行INSERT完整批处理而没有具体指定日期?

小智 6

尼尔斯,

Hive 12及以下版本具有动态分区的众所周知的可伸缩性问题,将通过Hive 13解决.问题是Hive尝试为其写出的每个分区保持文件句柄打开,这会导致内存不足和崩溃.Hive 13将按分区键排序,因此它只需要一次打开一个文件.

我看到你有3个选项

  1. 将您的作业更改为一次只插入几个分区.
  2. 等待Hive 13被释放并尝试(2-3个月等待).
  3. 如果你知道如何,从trunk构建Hive并使用它来完成数据加载.