通过 Hive 执行计划了解 SQL 执行过程
✅ 执行计划基本操作
1. 查看执行计划
-- 基本语法
EXPLAIN SELECT * FROM table WHERE condition;
-- 详细信息
EXPLAIN EXTENDED SELECT * FROM table WHERE condition;
-- 显示优化后的执行计划
EXPLAIN FORMATTED SELECT * FROM table WHERE condition;
2. 执行计划结构
EXPLAIN
SELECT category, SUM(amount)
FROM sales
WHERE dt = '2024-11-06'
GROUP BY category;
✅ 执行计划解读
1. Stage 划分
STAGE DEPENDENCIES:
Stage-0 is a root stage
Stage-1 depends on stages: Stage-0
STAGE PLANS:
Stage-0: -- 驱动阶段(如 DDL 操作)
...
Stage-1: Map Reduce -- 主要计算阶段
...
2. Map 阶段分析
Map Operator Tree:
TableScan -- 表扫描
alias: sales
Statistics: Num rows: 1000000 Data size: 20000000 Basic stats: COMPLETE Column stats: NONE
Filter Operator -- WHERE 过滤
predicate: (dt = '2024-11-06')
Statistics: Num rows: 100000 Data size: 2000000 Basic stats: COMPLETE Column stats: NONE
Select Operator -- 字段选择
expressions: category, amount
Statistics: Num rows: 100000 Data size: 2000000 Basic stats: COMPLETE Column stats: NONE
Group By Operator -- GROUP BY 操作
keys: category
values: amount
Statistics: Num rows: 10000 Data size: 200000 Basic stats: COMPLETE Column stats: NONE
3. Reduce 阶段分析
Reduce Operator Tree:
Group By Operator -- Reduce 端聚合
keys: category
mode: mergepartial
Statistics: Num rows: 1000 Data size: 20000 Basic stats: COMPLETE Column stats: NONE
Select Operator -- 最终选择
expressions: category, _col1 (sum of amount)
File Output Operator -- 输出到文件
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
✅ 关键指标解读
1. 数据量统计
-- 关注 Statistics 信息
Statistics: Num rows: 1000000 Data size: 20000000
- Num rows: 预估行数
- Data size: 预估数据大小
- Basic stats: 统计信息完整性
2. 操作符分析
| 操作符 | 含义 | 优化建议 |
|---|---|---|
| TableScan | 表扫描 | 检查分区裁剪 |
| Filter Operator | WHERE 过滤 | 过滤条件前移 |
| Group By Operator | 分组聚合 | 检查数据倾斜 |
| Join Operator | JOIN 操作 | 检查 JOIN 策略 |
✅ 实际案例分析
案例 1:JOIN 策略识别
EXPLAIN
SELECT a.*, b.name
FROM big_table a
JOIN small_table b ON a.id = b.id;
Map Join 识别:
Map Join Operator -- 表示使用了 Map Join
condition map:
Inner Join 0 to: [1]
普通 Join 识别:
Reduce Output Operator -- 需要 Shuffle
key expressions: id
Map Join Operator -- 普通 Join 需要 Reduce 阶段
案例 2:数据倾斜检测
EXPLAIN EXTENDED
SELECT user_id, COUNT(*)
FROM user_log
GROUP BY user_id;
关注点:
- Group By Operator 的 keys 分布
- Statistics 中的行数估算是否合理
- 是否有 Combiner 优化
✅ 性能优化指导
1. 识别性能瓶颈
-- 关注以下指标
- TableScan 的数据量是否过大
- Filter Operator 的过滤比是否合理
- Group By Operator 的分组数是否过多
- Shuffle 数据量是否过大
2. 优化策略验证
-- 验证 Map Join
SET hive.auto.convert.join=true;
EXPLAIN SELECT ...; -- 查看是否出现 Map Join Operator
-- 验证分区裁剪
EXPLAIN SELECT * FROM table WHERE dt = '2024-11-06';
-- 检查 TableScan 是否只扫描指定分区
3. 数据倾斜处理
-- 原始查询执行计划
EXPLAIN SELECT category, COUNT(*) FROM large_table GROUP BY category;
-- 倾斜处理后的执行计划
EXPLAIN
SELECT category, SUM(cnt) FROM (
SELECT category, COUNT(*) as cnt FROM large_table GROUP BY category
) t GROUP BY category;
✅ 高级执行计划分析
1. 多 Stage 优化
-- 复杂查询可能涉及多个 Stage
EXPLAIN
SELECT a.category, SUM(b.amount)
FROM (
SELECT category, id FROM table_a WHERE status = 'active'
) a
JOIN (
SELECT id, amount FROM table_b WHERE amount > 100
) b ON a.id = b.id
GROUP BY a.category;
Stage 分析:
- Stage-1: 处理子查询 a
- Stage-2: 处理子查询 b
- Stage-3: JOIN 和 GROUP BY
2. 向量化执行
SET hive.vectorized.execution.enabled=true;
EXPLAIN FORMATTED
SELECT * FROM table WHERE condition;
向量化标识:
Vectorized execution: true
✅ 实用技巧
1. 快速问题定位
-- 检查是否走了 Map Join
grep -i "map join" explain_output
-- 检查数据量估算
grep "Num rows" explain_output
-- 检查分区裁剪
grep -i "partition" explain_output
2. 性能对比
-- 方案 A
EXPLAIN SELECT * FROM table WHERE condition_a;
-- 方案 B
EXPLAIN SELECT * FROM table WHERE condition_b;
-- 比较:
-- - 数据扫描量
-- - Stage 数量
-- - 是否有 Map Join
3. 配置验证
-- 验证优化配置是否生效
SET hive.optimize.cp=true; -- 列裁剪
SET hive.optimize.ppd=true; -- 谓词下推
SET hive.auto.convert.join=true; -- Map Join
EXPLAIN SELECT ...; -- 检查执行计划变化
📌 面试总结
通过 EXPLAIN 查看 Hive 执行计划:执行顺序为 TableScan → Filter → Select → Group By → Join → Reduce → Output。关键关注点:数据量统计(Num rows)、操作符类型(Map Join vs Shuffle Join)、Stage 划分、分区裁剪效果。优化方向:过滤条件前移、Map Join 触发、数据倾斜处理、向量化执行。
实践建议:每次复杂查询前都查看执行计划,验证优化策略是否生效。
6900

被折叠的 条评论
为什么被折叠?



