Hive执行计划查看方法详解

在 Hive 中查看执行计划(Execution Plan)是非常关键的 SQL 调优和问题诊断步骤。Hive 提供了不同详细程度的执行计划,主要分为两个阶段:

  1. 抽象语法树(AST):由 Hive 的解析器(Parser)生成,展示 SQL 被如何解析。
  2. MapReduce 执行计划(查询计划):由 Hive 的编译器(Compiler)生成,这是最常用和重要的执行计划,它展示了查询将被转换成怎样的 MapReduce 任务或其它计算引擎(如 Tez, Spark)的任务。

您主要通过 EXPLAINEXPLAIN 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: 输出操作,显示输出格式等。

通过这个计划,你可以清楚地看到数据是如何流动的,在哪里进行了过滤,在哪里进行了聚合。


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: 操作符名称(如 TableScanFilterGroup By)。
  • Statistics: 极其重要的调优信息!包括处理的数据量(Data size)、行数(Rows)等。如果统计信息不准,Hive 可能会生成糟糕的执行计划。
  • Cpu Time? / Config?: 可能的环境配置信息。
  • Operator Info: 操作的具体信息(如 group by: department, filter: (salary > 50000))。

FORMATTED 是日常查看执行计划的首选,因为它最易读,信息量也足够。


总结与最佳实践

命令用途推荐度
EXPLAIN查看基本的执行阶段和依赖关系。⭐⭐⭐
EXPLAIN EXTENDED深度调试,查看详细的输入输出元数据。⭐⭐ (需要时使用)
EXPLAIN FORMATTED查看最直观、信息丰富的执行计划,包含数据量统计。⭐⭐⭐⭐⭐ (首选)

调优时的关键检查点:

  1. 数据倾斜:在 EXPLAIN FORMATTEDStatistics 里,如果某个 Reduce 阶段处理的数据量远大于其他阶段,很可能发生了数据倾斜。
  2. 全表扫描:检查 TableScan 操作是否没有带上分区过滤条件(WHERE pt=‘202310’)。
  3. 无效的过滤:确认 Filter 操作符是否在期望的阶段出现。有时过滤条件可能会被推送到更早的阶段以减少数据传输。
  4. MapJoin:检查计划中是否出现了 Map Join Operator。对于小表关联,MapJoin 是性能优化的关键。如果没有,你可能需要设置 set hive.auto.convert.join=true;
  5. 阶段数量:过多的 MapReduce 阶段可能意味着复杂的查询或子查询,可以考虑能否简化 SQL。

熟练掌握 EXPLAIN,尤其是 EXPLAIN FORMATTED,是成为一名高效的 Hive 开发者和调优专家的必备技能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值