无法对 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 时,我是否缺少什么?

Neels,

Hive 12 及更低版本在动态分区方面存在众所周知的可伸缩性问题,这些问题将在 Hive 13 中得到解决。问题是 Hive 试图为它写出的每个分区保持文件句柄打开,这会导致内存不足并崩溃。Hive 13 将按分区键排序,以便一次只需打开一个文件。

如我所见,您有 3 个选择

  1. 将作业更改为一次仅插入几个分区。
  2. 等待 Hive 13 发布并尝试(等待 2-3 个月)。
  3. 如果您知道如何操作,请从主干构建 Hive 并使用它来完成数据加载。

最新更新