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

时间:2014-02-19 09:53:36

标签: hadoop hive

我有一张表test_details,有大约400万条记录。使用此表中的数据,我必须创建一个新的分区表test_details_par,其中的记录在visit_date上分区。创建表并不是一个挑战,但是当我来到我必须使用动态分区来插入数据的部分时,当我尝试插入数据更多天时,Hive放弃了。如果我在2或3天内执行此操作,则Map Reduce作业会成功运行,但在更多天内,它无法提供JAVA Heap Space ErrorGC 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是否有任何遗漏?

1 个答案:

答案 0 :(得分:6)

尼尔斯,

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

我有三个选项

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