坑1:动态分区字段要放在最后
set hive.auto.convert.join=true;
set hive.exec.parallel=true;
set hive.exec.dynamic.partition =true;
set hive.exec.dynamic.partition.mode = nonstrict;
--set hive.exec.max.dynamic.partitions=20000;
insert overwrite table dw.kaka_test partition(cal_dt)
select
cal_dt
,guid
,user_id
from dw.kaka_test_01
where cal_dt>='2021-03-20'
报错内容:
Fatal error occurred when node tried to create too many dynamic partitions.
The maximum number of dynamic partitions is controlled by hive.exec.max.dynamic.partitions
and hive.exec.max.dynamic.partitions.pernode. Maximum was set to: 100
一开始没有加set hive.exec.max.dynamic.partitions=20000,
以为是参数问题,加上以后还是报错,后来经查询发现动态分区字段需要放在最后
2:动态分区相关参数
set hive.exec.dynamic.partition =true; 是否启动动态分区 默认false
set hive.exec.dynamic.partition.mode = nonstrict;
动态分区类型,strict 要求至少包含一个静态分区列,nonstrict则无此要求
set hive.exec.max.dynamic.partitions=20000 最大动态分区数,默认1000
set hive.exec.max.dynamic.partitions.pernode = 1000,
一个 mapreduce job所允许的最大的动态分区的个数。默认是100
坑2:跑180天数据的时候,报oom的错
代码如上,参数是180天,报错截图如下,
后代码最后一行加上distribute by cal_dt后运行成功
set hive.auto.convert.join=true;
set hive.exec.parallel=true;
set hive.exec.dynamic.partition =true;
set hive.exec.dynamic.partition.mode = nonstrict;
--set hive.exec.max.dynamic.partitions=20000;
insert overwrite table dw.kaka_test partition(cal_dt)
select
guid
,user_id
,cal_dt
from dw.kaka_test_01
where cal_dt>='2020-09-01'
distribute by cal_dt
原因:
distribute by 是控制map端如何拆分数据给reduce端的,hive会根据distribute的key 默认hash分发,多分区map端会有大量小文件,reduce输出文件大小不均,小文件过多,文件超大等情况。通过参数调优的合并小文件在这里依然会报错,原因本茶树菇还没弄清楚,即使加了distribute by 还是会报错,真的是要了狗命了,求路过的大佬指点三四
小tips
(1)、尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
(2)、动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。