ToB企服应用市场:ToB评测及商务社交产业平台

标题: Hive执行计划之一文读懂Hive执行计划 [打印本页]

作者: 灌篮少年    时间: 2023-6-6 21:23
标题: Hive执行计划之一文读懂Hive执行计划
概述

Hive的执行计划描述了一个hiveSQL语句的具体执行步骤,通过执行计划解读可以了解hiveSQL语句被解析器转换为相应程序语言的执行逻辑。通过执行逻辑可以知晓HiveSQL运行流程,进而对流程进行优化,实现更优的数据查询处理。
同样,通过执行计划,还可以了解到哪些不一样的SQL逻辑其实是等价的,哪些看似一样的逻辑其实是执行代价完全不一样。
如果说Hive优化是一堵技术路上的高墙,那么关于Hive执行计划,就是爬上这堵高墙的一架梯子。
不同版本的Hive会采用不同的方式生成的执行计划。主要区别就是基于规则生成hive执行计划,和基于成本代价来生成执行计划。而hive早期版本是基于规则生成执行计划,在Hive0.14及之后的版本都是基于成本代价来生成执行计划,这主要是集成了Apache Calcite。Apache Calcite具体可以查看官网介绍。
两种方式的优劣显而易见,基于规则生成执行计划,作为使用方来说,集群的环境,数据量的大小完全不一样,同样的规则逻辑,执行起来差异巨大,因此会对开发者有更高的优化要求。Hive基于成本代价来生成执行计划,这种方式能够结合Hive元数据信息和Hive运行过程收集到的各类存储统计信息推测出一个更合理的执行计划。也就是说Hive本身已经为我们的SQL语句做了一轮优化了,可以预见的将来,Hive还会具备更多的优化能力。
Hive执行计划是一个预估的执行计划,只有在SQL实际执行后才会获取到真正的执行计划,而一些关系型数据库中,会提供真实的SQL执行计划。如SQLserver和Oracle等。
1.hive执行计划的查看

Hive提供的执行计划使用语法如下:
  1. EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
复制代码
以上内容重点关注explain,explain extend,explain dependency,explain authorization,explain vectorization。
2.学会查看Hive执行计划的基本信息

一个HIVE查询被转换为一个由一个或多个stage组成的序列(有向无环图DAG)。这些stage可以是MapReduce stage,也可以是负责元数据存储的stage,也可以是负责文件系统的操作(比如移动和重命名)的stage。
在查询SQL语句前加上关键字explain用来查看执行计划的基本信息。
可以看如下实例的执行计划结果解析:
实例SQL
  1. -- 本文默认使用mr计算引擎
  2. explain
  3. -- 统计年龄小于30岁各个年龄里,昵称里带“小”的人数
  4. select age,count(0) as num from temp.user_info_all where ymd = '20230505'
  5. and age < 30 and nick like '%小%'
  6. group by age;
复制代码
执行计划:
  1. # 描述任务之间stage的依赖关系
  2. STAGE DEPENDENCIES:
  3.   Stage-1 is a root stage
  4.   Stage-0 depends on stages: Stage-1
  5. # 每个stage详细信息
  6. STAGE PLANS:
  7.   Stage: Stage-1
  8.     Map Reduce
  9.       Map Operator Tree:
  10.           TableScan
  11.             alias: user_info_all
  12.             Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
  13.             Filter Operator
  14.               predicate: ((age < 30) and (nick like '%小%')) (type: boolean)
  15.               Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
  16.               Select Operator
  17.                 expressions: age (type: bigint)
  18.                 outputColumnNames: age
  19.                 Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
  20.                 Group By Operator
  21.                   aggregations: count(0)
  22.                   keys: age (type: bigint)
  23.                   mode: hash
  24.                   outputColumnNames: _col0, _col1
  25.                   Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
  26.                   Reduce Output Operator
  27.                     key expressions: _col0 (type: bigint)
  28.                     sort order: +
  29.                     Map-reduce partition columns: _col0 (type: bigint)
  30.                     Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
  31.                     value expressions: _col1 (type: bigint)
  32.       Reduce Operator Tree:
  33.         Group By Operator
  34.           aggregations: count(VALUE._col0)
  35.           keys: KEY._col0 (type: bigint)
  36.           mode: mergepartial
  37.           outputColumnNames: _col0, _col1
  38.           Statistics: Num rows: 2719524 Data size: 65268576 Basic stats: COMPLETE Column stats: NONE
  39.           File Output Operator
  40.             compressed: true
  41.             Statistics: Num rows: 2719524 Data size: 65268576 Basic stats: COMPLETE Column stats: NONE
  42.             table:
  43.                 input format: org.apache.hadoop.mapred.SequenceFileInputFormat
  44.                 output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
  45.                 serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
  46.   Stage: Stage-0
  47.     Fetch Operator
  48.       limit: -1
  49.       Processor Tree:
  50.         ListSink
复制代码
我们将上述结果拆分看,先从最外层开始,包含两个大的部分:
先看第一部分 stage dependencies ,包含两个 stage,Stage-1 是根stage,说明这是开始的stage,Stage-0 依赖 Stage-1,Stage-1执行完成后执行Stage-0。
一些Hive执行逻辑的可视化工具页面就是利用该语句信息绘画出Hive执行流程图以及相关进度信息。
再看第二部分 stage plan,里面有一个 Map Reduce,一个MR的执行计划分为两个部分:
这两个执行计划树里面包含这条sql语句的 operator:
map端Map Operator Tree信息解读:
接下来是reduce阶段Reduce Operator Tree,出现和map阶段关键词一样的,其含义是一致的,罗列一下map阶段未出现的关键词。
Stage-0的操作信息。
3.执行计划步骤操作过程

可以根据上述执行计划通过流程图来描述一下hiveSQL的执行逻辑过程。

通过上图可以很清晰的了解一个hiveSQL的执行逻辑过程,便于理解hive数据流转过程。
4.explain extended

explain extended可以查看explain的扩展信息,主要包含三个部分内容:
  1. explain extended
  2. -- 统计年龄小于30岁各个年龄里,昵称里带“小”的人数
  3. select age,count(0) as num from temp.user_info_all where ymd = '20230505'
  4. and age < 30 and nick like '%小%'
  5. group by age;
复制代码
下一期:Hive执行计划之hive依赖及权限查询和常见使用场景
按例,欢迎点击此处关注我的个人公众号,交流更多知识。
后台回复关键字 hive,随机赠送一本鲁边备注版珍藏大数据书籍。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4