Hive动态分区strict与nonstrict模式对比及配置总结
做Hive数仓开发的,动态分区肯定天天用。往分区表导数据的时候自动创建对应分区,不用手动写ALTER TABLE一个个加,省了不少重复的体力活。 很多新人刚接触的时候容易在这踩坑,SQL逻辑看着没问题,一执行就抛动态分区相关的错误,查半天发现是默认的严格模式给拦住了。
默认的strict严格模式,核心规则其实很简单:执行动态分区插入时,至少得有一个分区列是静态指定的,不能所有分区值都完全靠查询结果动态生成。 这么设计是层安全兜底,防止SQL写漏条件,一下子生成数量失控的分区,给HDFS和元数据服务带来不必要的压力,也能避免分区值类型不符合预期的问题。 举个常见的二级分区表例子,比如表partition_test,分区字段是stat_date和province。在严格模式下,如果你想让stat_date和province都完全动态生成,不写死任何一个分区值,SQL是直接跑不通的。 这里很多人会绕进去,以为严格模式不让用动态分区,其实不是,是不能全都是动态的,至少留一个写死值的静态分区就可以。通常我们会把一级分区设为静态,比如先指定stat_date的具体日期,province字段动态生成,这样是完全符合严格模式要求的。
把模式改成nonstrict非严格模式,就没有这个限制了。所有分区列都可以设为动态,完全由查询结果里的值自动创建分区。 还是上面那张表,开启非严格模式后,stat_date和province都可以从源表查出来自动生成分区,不用提前指定任何固定值。 灵活性确实高了不少,但风险也跟着上来了。如果源数据里分区字段的基数很高,很容易一次跑出成千上万的分区,后续查询性能下降、小文件堆积、元数据压力变大这些问题都会陆续暴露。线上真跑起来,问题往往比预想的多。
要用动态分区,第一步得先开总开关。参数是hive.exec.dynamic.partition,默认值是false,设为true才算正式启用动态分区功能。 SET hive.exec.dynamic.partition=true;
控制模式的参数是hive.exec.dynamic.partition.mode,默认就是strict。需要全动态分区的场景,改成nonstrict就行。 SET hive.exec.dynamic.partition.mode=nonstrict;
除了这两个核心参数,还有几个控制上限的参数也得心里有数,不然分区数一多就容易触发报错。 hive.exec.max.dynamic.partitions.pernode,每个MapReduce任务节点允许创建的最大分区数,默认是100。单节点生成的分区数超过这个值就会抛异常,数据量大的场景通常要调大一些。 hive.exec.max.dynamic.partitions,单条DML语句整体允许创建的最大分区总数,默认是1000。全量导入历史数据的时候很容易碰到这个上限,要根据实际业务情况调整。 还有hive.exec.max.created.files,所有MapReduce任务总共允许创建的文件数量上限,默认100000。分区数上去了,文件数自然跟着涨,这个参数也要对应着调整。
实际用的时候,分区字段怎么选,还是要结合日常的查询模式来。比如大部分查询都会带日期条件,那把日期作为一级分区基本是稳妥的选择。 非严格模式不要随便开,能通过静态分区限定范围的场景,尽量用strict模式。实在需要全动态分区的场景,最好先摸清楚源数据的分区基数,别上来就跑全量。配合上面两个最大分区数的参数做限制,能兜住很多意外情况。 上线之后也不能撒手不管,得定期盯着分区的增长情况和查询性能。如果发现某个分区下小文件堆积严重,可以考虑合并小文件,或者再加一层分区做更细的拆分;反过来如果分区拆得太碎,也可以适当收敛合并。
下面是一个完整的非严格模式动态分区示例,从建表到插入数据的流程都包含在内。
CREATE TABLE partition_test ( member_id STRING, name STRING ) PARTITIONED BY ( stat_date STRING, province STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE partition_test PARTITION (stat_date, province) SELECT member_id, name, stat_date, province FROM partition_test_input;
动态分区本身是个能大幅提升开发效率的功能,关键是选对模式、配好参数。
作为一款成熟的SSL证书工具,来此加密运行8年,积累了丰富的行业经验,帮助大量用户解决证书申请难题。支持多域名证书、通配符证书申请,单张证书最多覆盖100个域名,适合多域名运营的用户,同时操作简单,免费好用。
对分区可控的场景优先用严格模式,稳定性更高;必须全动态的场景再开非严格模式,同时做好上限控制和日常监控,就能避开大部分常见的坑。

浙公网安备 33010602011771号