为何Tez引擎对简单Insert语句添加Reduce阶段?如何通过配置移除?
为何Tez引擎会给简单Insert语句添加Reduce阶段及移除方法
一、原因分析
Tez为这类简单Insert语句引入Reduce阶段,主要源于以下几点:
- LIMIT子句的全局截断逻辑:Hive默认会通过Reduce阶段统一处理LIMIT的行数限制,避免多个Map任务各自返回数据导致最终结果行数超出预期,哪怕是单表扫描加LIMIT的场景也会触发。
- ORC存储的写入优化机制:ORC作为列式存储格式,Hive默认会在写入时通过Reduce阶段合并数据、调整文件结构,保证生成的ORC文件符合最优存储规范(如合适的stripe大小、文件大小)。
- 优化器规则未触发Map-Only计划:在Hive 3.1.0 + Tez 0.10.2的组合中,针对
CREATE TABLE ... AS SELECT创建的目标表,优化器可能未自动触发Map-Only执行计划优化,导致冗余的Reduce阶段被保留。
二、移除Reduce阶段的配置方案
以下配置组合可强制触发Map-Only执行计划,解决你的问题:
1. 启用Map-Only核心优化
-- 小数据场景下启用本地模式,减少分布式调度开销 set hive.exec.mode.local.auto=true; -- 关闭倾斜连接优化,避免不必要的Reduce触发 set hive.optimize.skewjoin=false; set hive.optimize.skewjoin.compiletime=false; -- 启用无条件任务的自动转换,简化执行计划 set hive.auto.convert.join.noconditionaltask=true;
2. 让LIMIT在Map端处理
-- 关闭LIMIT下推的内存检查,允许直接在Map阶段截断数据 set hive.limit.pushdown.memory.usage.check=false; -- 扩展Fetch任务的处理范围,覆盖简单Insert场景 set hive.fetch.task.conversion=more;
3. 关闭ORC写入的Reduce合并逻辑
-- 关闭ORC文件的自动合并,避免触发Reduce阶段 set hive.orc.merge.size=0; set hive.orc.merge.max.files=0;
验证方法
配置完成后,执行EXPLAIN insert into my_orc_table_25 select * from my_orc_table limit 5;查看执行计划,若显示只有Map阶段(无Reduce)则配置生效。
内容的提问来源于stack exchange,提问作者user21579832
相关产品推荐
相关产品推荐

