大数据Hive-SQL执行计划解读(explain)
mhr18 2024-10-17 10:44 23 浏览 0 评论
Hive SQL的执行计划描绘SQL实际执行的整体轮廓,通过执行计划能了解SQL程序再转换成相应计算引擎的执行逻辑,掌握了执行逻辑也就好把握程序出现的瓶颈点从而能够实现更有针对性的优化,此外还能帮助开发者识别看似等价的SQL其实不等价,看似不等价的SQL其实是等价的SQL。可以说执行计划是打开SQL优化大门的一把钥匙。
Hive在不同的版本会采用不同的方式生成执行计划。在Hive早期版本中使用基于规则的方式生成执行计划,这种方式会基于既定的规则来生成执行计划,不会根据环境变化选择不同的执行计划。在Hive 0.14版本及以后,Hive集成了Apache Calcite,使得Hive也能够基于成本代价来生成执行计划,这种方式能够结合Hive的元数据信息和Hive运行过程收集的各类统计信息推测一个更为合理的执行计划出来。Hive目前所提供的执行计划都是预估的执行计划。在关系型型数据库,例如Oracle还会提供一种真实的计划,即SQL实际执行完成后,才能获得的执行计划。
通过本章的学习,读者应该能够看懂大部分的HiveSQL的执行计划,并能够理解HiveSQL在执行时每一步的具体操作。
扩展:在Hive 2.0版本以后加大了基于成本优化器(CBO)的支持。
查看SQL的执行计划方式
目前Hive提供的执行计划,可以查看的信息有以下几种:
- 查看执行计划基本信息,即explain。
- 查看执行计划的扩展信息,即explain extended。
- 查看SQL数据输入依赖的信息,即explain dependency。
- 查看SQL操作相关权限的信息,即explain authorization。
- 查看SQL的向量化描述信息,即explain vectorization。
explain查看执行计划基本信息
在查询语句的SQL前面加上关键字explain是查看执行计划的基本方法,用explain打开的执行计划包含两部分:
- l 作业的依赖关系图,即STAGE DEPENDENCIES。
- l 每个作业的详细信息,即STAGE PLANS。
我们见下面的案例1,来看下基本执行计划包含的内容。
案例1 查看简单SQL的执行计划
--默认情况下,使用MapReduce计算引擎
explain
--下面的SQL表示统计年龄小于30岁的各个年龄段中,名字中带“红”的人数
select s_age,count(1) num from student_tb_orc
where s_age<30 and s_name like '%红%'
group by s_age;
下图是案例1的执行结果的部分内容:
//描述整任务之间stage的依赖关系
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
//每个stage的详细信息
STAGE PLANS:
//stage-1的MapReduce过程
Stage: Stage-1
Map Reduce
//表示Map阶段的操作
Map Operator Tree:
TableScan
alias: student_tb_orc
Statistics: Num rows: 20000000 Data size: 30427200000 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: ((s_age < 30) and (s_name like '%红%')) (type: boolean)
Statistics: …
Select Operator
expressions: s_age (type: bigint)
outputColumnNames: s_age
Statistics: …
Group By Operator
aggregations: count(1)
keys: s_age (type: bigint)
mode: hash
outputColumnNames: _col0, _col1
Statistics: ….
Reduce Output Operator
key expressions: _col0 (type: bigint)
sort order: +
Map-reduce partition columns: _col0 (type: bigint)
Statistics:….
value expressions: _col1 (type: bigint)
Execution mode: vectorized
//Reduce阶段的操作
Reduce Operator Tree:
Group By Operator
aggregations: count(VALUE._col0)
keys: KEY._col0 (type: bigint)
mode: mergepartial
outputColumnNames: _col0, _col1
Statistics:…
File Output Operator
compressed: false
Statistics:…
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink
可以看到stage dependencies描绘了作业之间的依赖关系,即stage0依赖stage-1的执行结果。stage-0表示客户端的读取stage-1的执行结果,stage-1表示如下SQL,即select * from student_tb_orc where s_age<30 and s_name like ‘%红%’的执行过程。
Stage-1分为两个阶段Map和Reduce阶段,对应的执行计划关键词解读如下:
- l MapReduce:表示当前任务执行所用的计算引擎是MapReduce。
- l Map Opertaor Tree:表示当前描述的Map阶段执行的操作信息。
- l Reduce Opertaor Tree:表示当前秒时的是Reduce阶段的操作信息。
接下来解读上面两个操作数的解读,在解读时会尽量保持原有执行计划打印的缩进来解读。
Map阶段
Map操作树(Map Operator Tree)信息解读如下:
- l TableScan:表示对关键字alias声明的结果集,这里指代student_tb_orc,进行表扫描操作。
- l Statistics:表示对当前阶段的统计信息。例如当前处理的数据行和数据量。这两个都是预估值。
- l Filter Operator:表示在之前操作(TableScan)的结果集之上进行数据的过滤。
- l predicate:表示filter Operator进行过滤时,所用的谓词,即s_age<30 and s_name like '%红%'。
- l Select Operator:表示在之前的结果集之上对列进行投影,即筛选列。
- l expressions:表示在需要投影的列,即筛选的列。
- l outputColNames:表示输出的列名。
- l Group By Operator:表示在之前的结果集之上分组聚合。
- l aggreations:表示分组聚合使用的算法,这里是count(1)。
- l keys:表示分组的列,在该例子表示的是s_age。
- l Reduce output Operator:表示当前描述的是对之前结果聚会后的输出信息,这表示Map端聚合后的输出信息。
- l key expressions/value expressions:MapReduce计算引擎,在Map阶段和Reduc阶段输出的都是键值对的形式,这里key expression,value expressions分别描述的就是Map阶段输出的键(key)和输出的值(value)所用的数据列,这里的例子key expressions指代的就是s_age列,value exporess 指代的就是count(1)列。
- l sort order:表示输出是否进行排序,+表示正序,-表示倒叙。
- l Map-reduce partition columns:表示Map阶段输出到Reduce阶段的分区列,在Hive-SQL中,可以用distribute by指代分区的列。
Reduce阶段
所涉及的关键词与Map阶段的关键词一样的,字段表示含义相同,不再罗列,下面是Reduce中出现但是在Map阶段没有出现的关键词:
- l compressed:在File Output Operator中这个关键表示文件输出的结果是否进行压缩,false表示不进行输出压缩。
- l table:表示当前操作表的信息。
- l input format/out putformat 分别表示文件输入和输出的文件类型。
- l serde:表示读取表数据的序列化和反序列化的方式。
在不同计算引擎整个执行计划差别也不大,例如我们可以用下面的案例2得到的执行计划结果,同案例结果对比一下,案例2是将案例1的代码放到Spark引擎上执行。
案例2 在Spark计算引擎上生成的Hive执行计划
-使用spark做为计算引擎,业务逻辑同案例1
set hive.execution.engine=spark;
explain
select s_age,count(1) num from student_tb_orc
where s_age<30 and s_name like '%红%'
group by s_age;
上面命令打印的执行计划如下:
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
STAGE PLANS:
Stage: Stage-1
Spark
Edges:
Reducer 2 <- Map 1 (GROUP, 152)
DagName: hdfs_20190420145757_ef458316-083a-4713-8894-0bd8f06649a9:1
Vertices:
Map 1
Map Operator Tree:
TableScan
alias: student_tb_orc
Statistics: Num rows: 20000000 Data size: 30427200000 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: ((s_age < 30) and (s_name like '%红%')) (type: boolean)
Statistics: Num rows: 3333333 Data size: 5071199492 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: s_age (type: bigint)
outputColumnNames: s_age
Statistics: Num rows: 3333333 Data size: 5071199492 Basic stats: COMPLETE Column stats: NONE
Group By Operator
aggregations: count(1)
keys: s_age (type: bigint)
mode: hash
outputColumnNames: _col0, _col1
Statistics: Num rows: 3333333 Data size: 5071199492 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
key expressions: _col0 (type: bigint)
sort order: +
Map-reduce partition columns: _col0 (type: bigint)
Statistics: Num rows: 3333333 Data size: 5071199492 Basic stats: COMPLETE Column stats: NONE
value expressions: _col1 (type: bigint)
Execution mode: vectorized
Reducer 2
Reduce Operator Tree:
Group By Operator
aggregations: count(VALUE._col0)
keys: KEY._col0 (type: bigint)
mode: mergepartial
outputColumnNames: _col0, _col1
Statistics: Num rows: 1666666 Data size: 2535598985 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: false
Statistics: Num rows: 1666666 Data size: 2535598985 Basic stats: COMPLETE Column stats: NONE
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink
对比MapReduce最终执行计划,可以发现整体逻辑一致,只是Spark会将所有的任务组织成DAG(有向无环图),所有的任务以顶点表示,任务之间的关系以边表示。
在MapReduce中的Map和Reduce任务在Spark中以Map 1顶点表示,Reducer 2顶点表示,Edges表示顶点之间的联系。从这里我们也再次感受到学会看懂MapReduce的执行计划,对学会看懂其它计算引擎的执行计划也是有极大的帮助。
相关推荐
- 【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报
-
近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...
- 医院信息系统突发应急演练记录(医院信息化应急演练)
-
信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...
- 一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序
-
简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...
- docker搭建系统环境(docker搭建centos)
-
Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...
- 基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)
-
SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...
- Java21杀手级新特性!3行代码性能翻倍
-
导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...
- 一文读懂JDK21的虚拟线程(java虚拟线程)
-
概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...
- 效率!MacOS下超级好用的Linux虚拟工具:Lima
-
对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...
- 所谓SaaS(所谓三维目标一般都应包括)
-
2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...
- ORA-00600 「25027」 「x」报错(报错0xc0000001)
-
问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...
- 安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 编译安卓源码(编译安卓源码 电脑配置)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“
-
2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...
- Syslog 日志分析与异常检测技巧(syslog发送日志配置)
-
系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...
- 从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)
-
数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)