Hive执行计划之只有map阶段SQL性能分析和解读

这篇具有很好参考价值的文章主要介绍了Hive执行计划之只有map阶段SQL性能分析和解读。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录
  • 概述
  • 1.不带函数操作的select-from-where型简单SQL
    • 1.1执行示例
    • 1.2 运行逻辑分析
    • 1.3 伪代码解释
  • 2.带普通函数和运行操作符的普通型SQL执行计划解读
    • 2.1 执行计划解读
    • 2.2 伪代码解释逻辑

概述

可能所有的SQLboy刚接触SQL语句的时候都是select xxx from xxx where xxx。在hive中,我们把这种语句称为select-from-where型语句,也可称为简单SQL,这类简单SQL是特指不含有变转换函数,聚合函数,开窗函数和连接操作的SQL语句。

这类SQL主要特征是只有map阶段,没有reduce阶段。

本文分析一下这类简单SQL执行计划和性能,让我们从最基础的SQL分析,hive简单语句select from where 型语句性能分析,逐渐深入,进而学会分析复杂SQL的性能和执行计划。

所有的复杂SQL(几百行?上千行?)都是由一个个简单SQL带一些特殊函数堆叠而成的。

1.不带函数操作的select-from-where型简单SQL

这类SQL语句通常只有select-from-where,没有其他函数操作,或者操作符处理,例如字符串截取。

1.1执行示例

例1 不带函数操作的select-from-where型简单SQL。

-- 本文默认使用mr计算引擎
explain
-- 统计年龄等于30岁的所有昵称
select age,nick from temp.user_info_all 
where ymd = '20230505'
and age = 30;

执行执行计划结果:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: user_info_all
            Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
            Filter Operator
              predicate: (age = 30) (type: boolean)
              Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
              Select Operator
                expressions: 30 (type: bigint), nick (type: string)
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
                File Output Operator
                  compressed: true
                  Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
                  table:
                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

通过以上内容,我们可以看到,整个SQL逻辑执行过程中只有map操作树(Map Operate Tree),若转换成MapReduce来看的话,即只有Map阶段的任务。

如果有执行计划里关键词不熟悉的,建议阅读这篇 Hive执行计划之一文读懂Hive执行计划 。

1.2 运行逻辑分析

以上流程我们可以分解为运行逻辑图来看,如下图:

Hive执行计划之只有map阶段SQL性能分析和解读

我们在之前的文章中提起过,Hive执行计划是一个预估的执行计划,只有在SQL实际执行后才会获取到真正的执行计划。那我们来看看以上语句的实际运行控制台打印过程。额,失算了,因为结果太多,限制一下输出条数。

Query ID = hdfs_20230613111158_03c8f6e1-e04f-4e4e-aa9b-569a89860438
Total jobs = 1
Launching Job 1 out of 1
# 这里表示没有reduce任务,reduce任务执行的服务器节点是0个。
Number of reduce tasks is set to 0 since there's no reduce operator
...
Hadoop job information for Stage-1: number of mappers: 6; number of reducers: 0
2023-06-13 11:12:28,564 Stage-1 map = 0%,  reduce = 0%
2023-06-13 11:12:45,219 Stage-1 map = 17%,  reduce = 0%, Cumulative CPU 6.17 sec
...
2023-06-13 11:12:54,523 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 40.52 sec
MapReduce Total cumulative CPU time: 40 seconds 520 msec
Ended Job = job_1675664438694_14052273
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 6   Cumulative CPU: 40.52 sec   HDFS Read: 203436481 HDFS Write: 2412 SUCCESS
Total MapReduce CPU Time Spent: 40 seconds 520 msec

从上面的结果可以知道,实际的运行过程也是只有map阶段的操作。

针对select-from-where只有map阶段操作而没有reduce阶段的主要原因是这类SQL只有从表中读取数据并执行数据行的过滤,并没有需要将HDFS在其他节点上的数据与该节点数据放在一起处理的必要,因此这类SQL不需要reduce操作。Map阶段过滤后的数据,就是最终的结果数据。

这种只含map的操作,如果文件大小控制在合适的情况下,都将只有本地操作,其执行非常高效,运行效率完全不输于在计算引擎Tez和Spark上运行。感兴趣的小伙伴可以去将三者运行效率比对一下。

1.3 伪代码解释

接下来我们再以mr伪代码的方式理解一下上述语句的运行情况:

例2 MRselect-from-where简单SQL代码解析

map(inkey,invalue,context);
colsArray = invalue.split("\t");
//对应filter操作,过滤掉age=30的数据行,ymd为分区列,属于文件级操作,这里不展示了。
if int(colsArray[11]) == 30 {
  //获取age,nick两列,就是投影操作,即select操作
  age = colsArray[11];
  nick = colsArray[7];
  //最后输出两列age,nick,执行计划中对应的为_col0和_col1.这里invalue为1
  context.write(age,nick);
}
reduce(inkey,invalue,context)
  //pass表示不会执行
  pass;

2.带普通函数和运行操作符的普通型SQL执行计划解读

这里的普通函数特指除表转换函数(UDTF),聚合函数和窗口函数之外的函数。例如:nvl(),cast(),case when,concat(),year()等,具体有哪些,后续会专门罗列。

这类SQL也属于select-from-where型SQL,其主要特点也是只有map阶段处理。

我们也可以给它更具体的称为 select-function(column)-from-where-function(column)类。

2.1 执行计划解读

接下来可以看一个带普通函数和操作符的SQL执行计划案例。

例3 带普通函数和操作符的SQL运行计划。

explain
-- 统计年龄等于30岁的所有昵称
select uid,
nvl(client,'android') as client,
case when age > 20 then '老腊肉' else '小鲜肉' end as label,
concat(nick,'_测试') as nick, 
cast(chat_uv as double)/10 as chat
from temp.user_info_all 
where ymd = '20230505'
and age in (18,19,20,21) and chat_uv is not null and substr(uid,0,1) = '1';

输出的执行计划结果:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: user_info_all
            Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
            # where 条件过滤
            Filter Operator
              predicate: ((age) IN (18, 19, 20, 21) and chat_uv is not null and (substr(uid, 0, 1) = '1')) (type: boolean)
              Statistics: Num rows: 8158574 Data size: 195805776 Basic stats: COMPLETE Column stats: NONE
              # 列投影
              Select Operator
                expressions: uid (type: bigint), NVL(client,'android') (type: string), CASE WHEN ((age > 20)) THEN ('老腊肉') ELSE ('小鲜肉') END (type: string), concat(nick, '_测试') (type: string), (UDFToDouble(chat_uv) / 10) (type: double)
                outputColumnNames: _col0, _col1, _col2, _col3, _col4
                Statistics: Num rows: 8158574 Data size: 195805776 Basic stats: COMPLETE Column stats: NONE
                File Output Operator
                  compressed: true
                  Statistics: Num rows: 8158574 Data size: 195805776 Basic stats: COMPLETE Column stats: NONE
                  table:
                      input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                      output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                      serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

通过以上执行计划我们可以看到,这个结果同select-from-where 型SQL,只有map阶段的操作,如果实际去运行以上任务,得到的执行步骤也和例1类似。即在map运行完整个作业任务结束。

结合以上实例我们可以得出一个结论 select-function(colums)-from-where-function(column)这种类型的SQL可以归于select-from-where类简单SQL类型。

2.2 伪代码解释逻辑

例4 例2的MapReduce伪代码执行逻辑。

//整个程序只有map阶段,没有reduce逻辑
map(inkey,invalue,context);
//数据输入是一行数据
colsArray = invalue.split("\t");
if age in (18,19,20,21) and chat_uv != null and substr(uid, 0, 1) == '1'{
  uid = colsArray[0];
  client = colsArray[3];
  if client == null{
    client = 'android';
  }
  label = '';
  if age > 20 {
    label = '老腊肉';
  } else {
    label = '小鲜肉';
  }
  nick = nick+'_测试');
  chat = double(chat_uv)/10;
}
context.write(uid,client+'\t'+label+'\t'+nick+'\t'+chat);

下一期:Hive常见时间函数的使用与问题整理

按例,欢迎点击此处关注我的个人公众号,交流更多知识。

后台回复关键字 hive,随机赠送一本鲁边备注版珍藏大数据书籍。文章来源地址https://www.toymoban.com/news/detail-481165.html

到了这里,关于Hive执行计划之只有map阶段SQL性能分析和解读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL性能分析-整理

    昨日对MySQL的索引整理了一份小文档,对结构/分类/语法等做了一个小总结,具体文章可点击:MySQL-索引回顾,索引知识固然很重要,但引入运用到实际工作中更重要。 参考之前的文章:SQL优化总结以及参考百度/CSDN/尚硅谷/黑马程序员/阿里云开发者社区,我个人把SQL性能分析

    2024年01月23日
    浏览(38)
  • SQL性能分析手段

    MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供整个服务器执行sql的状态信息。通过如下指令,可以查看当前数据库的 INSERT、UPDATE、DELETE、SELECT 的访问频次: Com_delete : 删除次数 Com_insert : 插入次数 Com_select : 查询次数 Com_update : 更新次数 通过查看这些次数

    2024年01月19日
    浏览(39)
  • 什么是hive的高级分组聚合,它的用法和注意事项以及性能分析

    hive的高级分组聚合是指在聚合时使用GROUPING SETS、CUBE和ROLLUP的分组聚合。 高级分组聚合在很多数据库类SQL中都有出现,并非hive独有,这里只说明hive中的情况。 使用高级分组聚合不仅可以简化SQL语句,而且通常情况下会提升SQL语句的性能。 示例: Grouping sets的子句允许在一个

    2024年02月11日
    浏览(35)
  • 【MySQL进阶】SQL性能分析

    MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令,可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次: Com_delete: 删除次数    Com_insert: 插入次数 Com_select: 查询次数   Com_update: 更新次数 我们可以在当前数据库

    2024年02月07日
    浏览(43)
  • MySQL 优化—— SQL 性能分析

    MySQL 客户端连接成功后,通过 show [session | global] status 命令可以提供服务其状态信息。通过下面指令,可以查看当前数据库 CRUD 的访问频次: SHOW GLOBAL STATUS LIKE \\\'Com_______\\\'; 七个下划线代表这个七个占位。 查询数据库中整体的 CURD 频次,一般针对 select 比较多的数据库。 慢查询

    2024年02月13日
    浏览(46)
  • Mysql高级2-SQL性能分析

    MySQL客户端 连接成功后,通过show [session | global] status 命令可以提供服务器状态信息,通过如下指令,可以查看当前数据库的insert,update,dalete,select的访问频次 说明1:上面的数据库被执行查询4次   慢查询日志记录了所有执行时间超过指定参数(long_query_time 单位:秒,默认

    2024年02月15日
    浏览(38)
  • [MySQL] SQL优化之性能分析

    🌈键盘敲烂,年薪30万🌈 目录 一、索引优化 1、索引是什么: 2、索引的数据结构: 3、索引种类: 4、sql分析(回表查询) 二、定位慢查询语句 1、慢查询日志 2、profile详情 3、explain执行计划(重点) 4、查看执行频次   1、索引是什么: 通过一些约束,快速查询到相应字段

    2024年02月05日
    浏览(32)
  • mysql-sql性能分析工具

            MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次: -- session 是查看当前会话 ; -- global 是查询全局数据 ; SHOW GLOBAL STATUS LIKE \\\'Com_\\\'; 慢查询日志记录了所有执

    2024年02月12日
    浏览(35)
  • Hive执行计划

            Hive提供了explain命令来展示一个查询的执行计划 ,这个执行计划对于我们了解底层原理,Hive 调优,排查数据倾斜等很有帮助。 使用语法如下: 在 hive cli 中输入以下命令(hive 2.3.7): 得到结果: 我们将上述结果拆分看,先从最外层开始,包含两个大的部分: sta

    2024年02月19日
    浏览(26)
  • hive--执行计划

    我们大家总是在聊优化优化,那么怎么优化?相信每个人都有自己的一套方法论。在我看来的话,可能就是存储、模型、sql、以及Hive Job 层面的一些优化,后者更多的可能是IO优化 今天我们来聊一聊执行计划,如果掌握了MapReduce,且开发者有一定的经验积累可以反推Compiler将

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包