Hive CBO优化器原理
请解释Hive的基于成本的优化器(CBO)的工作原理,包括如何收集统计信息,CBO如何选择Join顺序和执行计划。
回答
我是大山
CBO(Cost-Based Optimizer): 基于表/分区/列的统计信息,估算不同执行计划的成本,选择最优执行计划。
一、统计信息收集:
表级统计:
ANALYZE TABLE table_name COMPUTE STATISTICS;
-- 收集:numRows、totalSize、rawDataSize
列级统计:
ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS;
-- 收集:numDVs(不同值数)、numNulls、max/min、avgColLen、maxColLen
-- 对分区表:ANALYZE TABLE table_name PARTITION(ds) COMPUTE STATISTICS;
Hive 3.x+自动收集:
SET hive.stats.autogather=true; -- 写入时自动收集
二、CBO优化过程:
- 解析SQL → 生成AST → 转换为逻辑计划
- 基于规则优化(RBO):谓词下推、列裁剪、分区裁剪
- CBO枚举:对Join顺序/Join类型/聚合方法等生成多种执行计划
- 成本估算:
- CPU成本:扫描行数×处理复杂度
- IO成本:读取字节数×存储格式因子
- 网络成本:Shuffle数据量
- 选择最优计划:选择总成本最低的执行计划
三、CBO影响的关键决策:
- Join顺序:小表先Join,减小中间结果(如RBO按SQL顺序,CBO按成本)
- Join算法:选择MapJoin(Broadcast)还是ReduceJoin(Shuffle)
- 聚合下推:提前聚合减少数据量
配置:
SET hive.cbo.enable=true; -- 默认true (Hive 2.x+)
SET hive.compute.query.using.stats=true; -- 使用统计信息
SET hive.stats.fetch.partition.stats=true;
注意: 统计信息过期会误导CBO,需要定期更新(尤其是分区数变化)。