前言
动态分区指的是:分区的字段值是基于查询结果自动推断出来的,核心语法就是insert+select。 具体内容指路文章:
https://blog.csdn.net/SHWAITME/article/details/136111924?spm=1001.2014.3001.5501文章浏览阅读483次,点赞15次,收藏8次。Hive的相关概念——分区表、分桶表https://blog.csdn.net/SHWAITME/article/details/136111924?spm=1001.2014.3001.5501
0 问题现象
现象:报错errorr如下:
[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 setto: 100
原因: Hive对其创建的动态分区数量实施限制,总结而言:每个执行MR的节点能创建动态分区的个数上限为100个(默认),所有执行MR的节点能创建动态分区的个数上限为1000个动态分区(默认),相关参数如下:
#在每个执行MR的节点上,最大可以创建多少个动态分区,默认值为100 hive.exec.max.dynamic.partitions.pernode=100; #在所有执行MR的节点上,最大一共可以创建多少个动态分区,默认1000 hive.exec.max.dynamic.partitions=1000; #整个MR Job中,最大可以创建多少个HDFS 文件,默认100000 hive.exec.max.created.files=100000;
实际生产环境中,上述参数可以调整。
1 问题解决
解决方案一:调整动态分区数
set hive.exec.dynamic.partition=true; 在每个执行MR的节点上,最大可以创建256个动态分区(默认值为100) set hive.exec.max.dynamic.partitions.pernode=256; #在所有执行MR的节点上,最大一共可以创建2048个动态分区(默认值为1000) set hive.exec.max.dynamic.partitions=2048;
虽然配置了上述参数,但是不能保证小文件的问题彻底解决,有时候还需要设置reduce数。 mapred.reduce.tasks的计算公式可以为:
dynamic.partitions(总) / dynamic.partitions.pernode (分节点)