Hive动态分区异常问题

异常信息

1
2
3
4
5
Error: java.lang.RuntimeException: 
org.apache.hadoop.hive.ql.metadata.HiveFatalException:
[Error 20004]: 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

原因

Hive对其创建的动态分区数量实施限制。默认值为每个节点100个动态分区,所有节点的总(默认)限制为1000个动态分区。但是,这可以调整。

解决办法

1
2
3
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=2048;
set hive.exec.max.dynamic.partitions.pernode=256;

用以上设置后不能保证正常,有时候还需要设置reduce数来配合动态分区使用

1
set mapred.reduce.tasks=10;

这几个参数需要满足一下条件:

1
dynamic.partitions / dynamic.partitions.pernode <=mapred.reduce.tasks

比如上面的例子:2048 / 256 = 8,如果mapred.reduce.tasks小于8就会报错,而hive默认reduce数是跟具数据量来动态调整的,所以有时候需要手动调整