我有一张表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;
在没有具体指定日期的情况下运行完整批次的INSERT是否有任何遗漏?
答案 0 :(得分:6)
尼尔斯,
Hive 12及更低版本具有动态分区的众所周知的可伸缩性问题,将通过Hive 13解决。问题是Hive尝试为其写出的每个分区保持文件句柄打开,这会导致内存不足和崩溃。 Hive 13将按分区键排序,这样它一次只需要打开一个文件。
我有三个选项