在 Hive 中查看执行计划(Execution Plan)是非常关键的 SQL 调优和问题诊断步骤。Hive 提供了不同详细程度的执行计划,主要分为两个阶段:
- 抽象语法树(AST):由 Hive 的解析器(Parser)生成,展示 SQL 被如何解析。
- MapReduce 执行计划(查询计划):由 Hive 的编译器(Compiler)生成,这是最常用和重要的执行计划,它展示了查询将被转换成怎样的 MapReduce 任务或其它计算引擎(如 Tez, Spark)的任务。
您主要通过 EXPLAIN 和 EXPLAIN EXTENDED 命令来查看这些计划。
1. 基础语法:EXPLAIN
这是最常用的命令,它会展示查询的标准执行计划,包括各个阶段之间的依赖关系。
语法:
EXPLAIN [FORMATTED] your_sql_statement;
示例:
假设我们有一个简单的查询:
EXPLAIN
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE salary > 50000
GROUP BY department;
输出解读:
输出结果看起来会有点复杂,但它遵循一个清晰的层级结构。关键部分包括:
- Stage dependencies: 展示了所有 Stage(阶段)之间的依赖关系。例如,一个 Reduce 阶段必须等待其对应的 Map 阶段完成。
- Stage plans: 这是核心部分,详细描述了每个 Stage 要做的事情。
- Map Operator Tree: 描述了 Map 阶段的操作。
tableScan: 表扫描操作,会显示涉及的表名和选择的列。filterOperator: 过滤操作(对应WHERE子句),会显示谓词条件(如salary > 50000)。groupByOperator: 如果存在 Hash 聚合(用于优化GROUP BY),会在这里显示。selectOperator: 字段选择。
- Reduce Operator Tree: 描述了 Reduce 阶段的操作。
groupByOperator: 最终的聚合操作在这里完成(如果 Map 端做了部分聚合,Reduce 端做最终聚合)。fileOutputOperator: 输出操作,显示输出格式等。
- Map Operator Tree: 描述了 Map 阶段的操作。
通过这个计划,你可以清楚地看到数据是如何流动的,在哪里进行了过滤,在哪里进行了聚合。
2. 扩展语法:EXPLAIN EXTENDED / EXPLAIN DEPENDENCY
这个命令提供比 EXPLAIN 更详细的信息,包括每个操作的输入输出字段名、数据类型等。对于进行深度调试非常有用。
语法:
-- 经典用法
EXPLAIN EXTENDED your_sql_statement;
-- Hive 2.x 及之后版本也更推荐使用 `EXPLAIN DEPENDENCY` 来查看数据依赖
EXPLAIN DEPENDENCY your_sql_statement;
-- 或者使用 `EXPLAIN AUTHORIZATION` 查看权限信息
示例:
EXPLAIN EXTENDED
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE salary > 50000
GROUP BY department;
输出解读:
输出结构与 EXPLAIN 类似,但包含了大量额外的元信息。例如,在 tableScan 中,你不仅能看到表名,还能看到所有列的详细名称和数据类型。这对于确认 Hive 是否正确理解了你的表结构非常有帮助。
3. 格式化输出:EXPLAIN FORMATTED (推荐)
这是 Hive 0.10.0+ 版本引入的最直观、最易读的命令。它以一种更像传统关系型数据库(如 PostgreSQL 或 Oracle)的方式呈现执行计划,非常清晰。
语法:
EXPLAIN FORMATTED your_sql_statement;
示例:
EXPLAIN FORMATTED
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE salary > 50000
GROUP BY department;
输出解读:
FORMATTED 的输出通常包含一个清晰的 Plan 表格,其中有以下关键列:
- Vertex: 执行节点(相当于一个 Map 或 Reduce 任务)。
- 依赖关系: 直观地显示了这个节点的前置节点是谁。
- Operator: 操作符名称(如
TableScan,Filter,Group By)。 - Statistics: 极其重要的调优信息!包括处理的数据量(
Data size)、行数(Rows)等。如果统计信息不准,Hive 可能会生成糟糕的执行计划。 - Cpu Time? / Config?: 可能的环境配置信息。
- Operator Info: 操作的具体信息(如
group by: department,filter: (salary > 50000))。
FORMATTED 是日常查看执行计划的首选,因为它最易读,信息量也足够。
总结与最佳实践
| 命令 | 用途 | 推荐度 |
|---|---|---|
EXPLAIN | 查看基本的执行阶段和依赖关系。 | ⭐⭐⭐ |
EXPLAIN EXTENDED | 深度调试,查看详细的输入输出元数据。 | ⭐⭐ (需要时使用) |
EXPLAIN FORMATTED | 查看最直观、信息丰富的执行计划,包含数据量统计。 | ⭐⭐⭐⭐⭐ (首选) |
调优时的关键检查点:
- 数据倾斜:在
EXPLAIN FORMATTED的Statistics里,如果某个 Reduce 阶段处理的数据量远大于其他阶段,很可能发生了数据倾斜。 - 全表扫描:检查
TableScan操作是否没有带上分区过滤条件(WHERE pt=‘202310’)。 - 无效的过滤:确认
Filter操作符是否在期望的阶段出现。有时过滤条件可能会被推送到更早的阶段以减少数据传输。 - MapJoin:检查计划中是否出现了
Map Join Operator。对于小表关联,MapJoin 是性能优化的关键。如果没有,你可能需要设置set hive.auto.convert.join=true;。 - 阶段数量:过多的 MapReduce 阶段可能意味着复杂的查询或子查询,可以考虑能否简化 SQL。
熟练掌握 EXPLAIN,尤其是 EXPLAIN FORMATTED,是成为一名高效的 Hive 开发者和调优专家的必备技能。

1894

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



