dynamic partition搬表 out of memory

在想启用dynamic partition来偷懒搬表的情况时,如果表的数据过大(例如我在六个节点上搬迁2亿数据)时,就会经常OOM。

样例SQL:

set hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions= 1000;
set hive.exec.max.dynamic.partitions.pernode=1000;

CREATE TABLE B (
NAME STRING
)
partitioned BY (NAME2 string,NAME3 string,NAME4 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
STORED AS PARQUET;

INSERT INTO TABLE B
PARTITION(NAME2,NAME3,NAME4)
select NAME2,NAME3,NAME4
FROM A;

我想将A表的数据进行分区,并导入B表。最简单的方式就启用动态分区。可是执行上面的SQL时,报出OOM错误。一般碰到OOM,我第一反应就是提高heap space。

set spark.executor.memory=25G;

结果还是一样OOM。难道是内存还不够吗?24G–>30G–>48GG。。还是不行。

最后找到一篇文章,启用hive.optimize.sort.dynamic.partition即可;

SET hive.optimize.sort.dynamic.partition=true

针对该参数和对应问题的解释:
该问题出现的原因是太多的文件同时进入写入。当启用hive.optimize.sort.dynamic.partition后面,动态分区列就会进行全局排序,这样REDUCE端,每个动态分区列的值只会有一个文件写入,从而REDUCE阶段降低了内存使用。

hive.optimize.sort.dynamic.partition
  • Default Value: true in Hive 0.13.0 and 0.13.1; false in Hive 0.14.0 and later (HIVE-8151)
  • Added In: Hive 0.13.0 with HIVE-6455

When enabled, dynamic partitioning column will be globally sorted. This way we can keep only one record writer open for each partition value in the reducer thereby reducing the memory pressure on reducers.
个人感觉就是在内部使用distribute by。

参考文章:
1、https://cloud.tencent.com/developer/article/1079007
2、https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
3、https://stackoverflow.com/questions/33147764/hive-setting-hive-optimize-sort-dynamic-partition

发表评论

电子邮件地址不会被公开。 必填项已用*标注