Hive执行计划之一文读懂Hive执行计划

news2024/11/25 7:11:54

目录

文章目录

    • 概述
    • 1.hive执行计划的查看
    • 2.学会查看Hive执行计划的基本信息
    • 3.执行计划步骤操作过程
    • 4.explain extended

概述

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提供的执行计划使用语法如下:

EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
  • EXPLAIN:查看执行计划的基本信息;
  • EXTENDED:加上 extended 可以输出有关计划的额外扩展信息。这些通常是物理信息,例如文件名等;
  • CBO:可以选择使用Calcite优化器不同成本模型生成计划。CBO 从 hive 4.0.0 版本开始支持;
  • AST:输出查询的抽象语法树。AST 在hive 2.1.0 版本删除了,存在bug,转储AST可能会导致OOM错误,将在4.0.0版本修复;
  • DEPENDENCY:dependency在EXPLAIN语句中使用会产生有关计划中输入的依赖信息。包含表和分区信息等;
  • AUTHORIZATION:显示SQL操作相关权限的信息;
  • LOCKS:这对于了解系统将获得哪些锁以运行指定的查询很有用。LOCKS 从 hive 3.2.0 开始支持;
  • VECTORIZATION:查看SQL的矢量化描述信息;
  • ANALYZE:用实际的行数注释计划。从 Hive 2.2.0 开始支持;

以上内容重点关注explain,explain extend,explain dependency,explain authorization,explain vectorization。

2.学会查看Hive执行计划的基本信息

一个HIVE查询被转换为一个由一个或多个stage组成的序列(有向无环图DAG)。这些stage可以是MapReduce stage,也可以是负责元数据存储的stage,也可以是负责文件系统的操作(比如移动和重命名)的stage。

在查询SQL语句前加上关键字explain用来查看执行计划的基本信息。

可以看如下实例的执行计划结果解析:

实例SQL

-- 本文默认使用mr计算引擎
explain
-- 统计年龄小于30岁各个年龄里,昵称里带“小”的人数
select age,count(0) as num from temp.user_info_all where ymd = '20230505'
and age < 30 and nick like '%小%'
group by age;

执行计划:

# 描述任务之间stage的依赖关系
STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1
# 每个stage详细信息
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) and (nick like '%%')) (type: boolean)
              Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
              Select Operator
                expressions: age (type: bigint)
                outputColumnNames: age
                Statistics: Num rows: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
                Group By Operator
                  aggregations: count(0)
                  keys: age (type: bigint)
                  mode: hash
                  outputColumnNames: _col0, _col1
                  Statistics: Num rows: 5439049 Data size: 130537176 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: 5439049 Data size: 130537176 Basic stats: COMPLETE Column stats: NONE
                    value expressions: _col1 (type: bigint)
      Reduce Operator Tree:
        Group By Operator
          aggregations: count(VALUE._col0)
          keys: KEY._col0 (type: bigint)
          mode: mergepartial
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 2719524 Data size: 65268576 Basic stats: COMPLETE Column stats: NONE
          File Output Operator
            compressed: true
            Statistics: Num rows: 2719524 Data size: 65268576 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

我们将上述结果拆分看,先从最外层开始,包含两个大的部分:

  • stage dependencies: 各个stage之间的依赖性

  • stage plan: 各个stage的执行计划

先看第一部分 stage dependencies ,包含两个 stage,Stage-1 是根stage,说明这是开始的stage,Stage-0 依赖 Stage-1,Stage-1执行完成后执行Stage-0。

一些Hive执行逻辑的可视化工具页面就是利用该语句信息绘画出Hive执行流程图以及相关进度信息。

再看第二部分 stage plan,里面有一个 Map Reduce,一个MR的执行计划分为两个部分:

  • Map Operator Tree: MAP端的执行计划树
  • Reduce Operator Tree: Reduce端的执行计划树

这两个执行计划树里面包含这条sql语句的 operator:

map端Map Operator Tree信息解读:

  • TableScan 对关键字alias声明的结果集进行表扫描操作。

    alias: 表名称

    Statistics: 表统计信息,包含表中数据条数,数据大小等

  • Filter Operator:过滤操作,表示在之前的表扫描结果集上进行数据过滤。

    predicate:过滤数据时使用的谓词(过滤条件),如sql语句中的and age < 30,则此处显示(age < 30),什么是谓词,以及优化点,可以详细看之前一篇文章谓词下推。

    Statistics:过滤后数据条数和大小。

  • Select Operator: 对列进行投影,即筛选列,选取操作。

    expressions:筛选的列名称及列类型

    outputColumnNames:输出的列名称

    Statistics:筛选列后表统计信息,包含表中数据条数,数据大小等。

  • Group By Operator:分组聚合操作。

    aggregations:显示聚合函数信息,这里使用count(0)

    keys:表示分组的列,如果没有分组,则没有此字段。

    mode:聚合模式,值有 hash:随机聚合;mergepartial:合并部分聚合结果;final:最终聚合

    outputColumnNames:聚合之后输出列名,_col0对应的是age列, _col1对应的是count(0)列。

    Statistics: 表统计信息,包含分组聚合之后的数据条数,数据大小。

  • Reduce Output Operator:输出到reduce操作结果集信息。

    key expressions:MR计算引擎,在map和reduce阶段的输出都是key-value形式,这里描述的是map端输出的键使用的是哪个数据列。_col0对应的是age列。

    sort order:值为空不排序;值为 + 正序排序,值为 - 倒序排序;值为 ± 排序的列为两列,第一列为正序,第二列为倒序,以此类推多值排序。

    Map-reduce partition columns:表示Map阶段输出到Reduce阶段的分区列,在HiveSQL中,可以用distribute by指定分区的列。这里默认为_col0对应的是age列。

    Statistics:输出结果集的统计信息。

    value expressions:对应key expressions,这里是value值字段。_col1对应的是count(0)列。

接下来是reduce阶段Reduce Operator Tree,出现和map阶段关键词一样的,其含义是一致的,罗列一下map阶段未出现的关键词。

  • File Output Operator:文件输出操作。

    compressed:表示输出结果是否进行压缩,true压缩,false不压缩。

  • table:表示当前操作表的信息。

    input format:输入文件类型。

    output format:输出文件类型。

    serde:读取表数据的序列化和反序列化方式。

Stage-0的操作信息。

  • Fetch Operator:客户端获取数据操作。

    limit:值为-1标识不限制条数,其他值为限制的条数。

  • Processor Tree:处理器树

    ListSink:数据展示。

3.执行计划步骤操作过程

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

在这里插入图片描述

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

4.explain extended

explain extended可以查看explain的扩展信息,主要包含三个部分内容:

  • 抽象语法树(Abstract Syntax Tree,AST):是SQL转换成MR或其他计算引擎的任务中的一个重要过程。AST 在HIVE-13533中从 explain extended 中删除 ,并在HIVE-15932 中恢复为单独的命令 。
  • 作业的依赖关系图,同explain展现内容。
  • 每个作业的详细信息,即Stage Plans,相比explain多了表配置信息,表文件存储路径等。具体可以通过以下命令进行查看比对。不作列举了。
explain extended
-- 统计年龄小于30岁各个年龄里,昵称里带“小”的人数
select age,count(0) as num from temp.user_info_all where ymd = '20230505'
and age < 30 and nick like '%小%'
group by age;

下一期:Hive执行计划之hive依赖及权限查询和常见使用场景

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

后台回复关键字 hive,随机赠送一本鲁边备注版珍藏大数据书籍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试人员迷茫之中如何找到职业发展的方向?

出现迷茫或焦虑的原因是什么&#xff1f; 也许每个人的原因不一样&#xff0c;但不外乎是下面这些原因叠加的结果。 1、敏捷和DevOps开发模式的推行&#xff0c;虽然20年的历史是否已经证明“敏捷已经失败了” 暂且不管&#xff0c;但敏捷/DevOps之风刮的还是很厉害&#xff0c…

每日一练 | 华为认证真题练习Day53

1、现在有以下10.24.0.0/24&#xff0c;10.24.1.0/24&#xff0c;10.24.2.0/24&#xff0c;10.24.3.0/24四个网段&#xff0c;这四个网段可以汇总为以下哪个网段&#xff1f;&#xff08;多选&#xff09; A. 10.24.0.0/23 B. 10.24.1.0/23 C. 10.24.0.0/22 D. 10.24.0.0/2…

Window环境rabbitmq安装教程

首先我们需要取官网下载对应的两个安装包 第一个是rabbitmq安装包路径在括号里&#xff08;Installing on Windows Manually — RabbitMQ&#xff09; 我们选择window下载即可。 下图是下载的样子&#xff0c;确认是这两个就没问题了 第二个是erlang&#xff08;http://erlang…

上海市计算机学会竞赛平台五月月赛题目汇总

我又来了&#xff01; 爆切了一大堆没用的水题后&#xff0c;我终于来发题解啦&#xff01;&#xff01;&#xff01; T1原题https://iai.sh.cn/problem/792 我们考虑通过计算最长上升连续自然数串&#xff08;是这么叫的吗&#xff09;来获取答案 可以开两个数组 和 来计…

从飞书妙记秒开率提升,看火山引擎A/B测试在研发场景的应用

作者&#xff1a;DataTester 用户体验是决定互联网产品能否长久生存的关键&#xff0c;每一个基于产品功能、使用和外观的微小体验&#xff0c;都将极大地影响用户留存和满意度。 对于企业协作平台飞书而言&#xff0c;用户体验旅程从打开产品页面的一瞬间就已开始&#xff0c;…

如何安装多个node版本(使用nvm)

1、卸载之前安装的所有node 2、下载nvm安装包&#xff0c;下载地址https://nvm.uihtm.com/ 3、安装nvm 4、打开cmd&#xff0c;运行命令 nvm install node版本号&#xff0c;安装对应版本的node 5、打开nvm的安装路径&#xff0c;可以看到安装的对应的node版本的文件夹 6、若有…

K8S之Deployment控制器管理应用(十一)

Deployment介绍 Deployment是最常用的K8s工作负载控制器&#xff08;Workload Controllers&#xff09;&#xff0c; 是K8s的一个抽象概念&#xff0c;用于更高级层次对象&#xff0c;部署和管理Pod。 Deployment的主要功能&#xff1a; • 管理Pod&#xff0c;即应用程序 •…

CS1237 数据实测

目录 硬件 测试数据 结论 性能 转换时间 硬件 外部电阻电位器 模拟 传感器信号 测试数据 一下记录数据为ADC原始数据未经过软件滤波 跳动幅度图片DEV_FREQUENCY_10DEV_PGA_1751DEV_FREQUENCY_40DEV_PGA_11562DEV_FREQUENCY_640DEV_PGA_18243DEV_FREQUENCY_640DEV_PGA_644…

Spring:什么是SpringBoot框架?①

前言&#xff1a; 我们说任何一个阶段的技术更迭都是在代码量&#xff0c;代码简洁度&#xff0c;封装后复杂关注度降低上下功夫&#xff0c;不断提升生产力。 Spring已经足够牛了&#xff0c;它的bean容器思想启迪和影响了众多的程序员&#xff0c;奠基引领了技术的发展。 在应…

人工智能直播的趋势分析报告

人工智能直播是指通过人工智能技术来模拟真人直播&#xff0c;通过机器学习和自然语言处理等技术实现。随着人工智能技术的不断发展&#xff0c;人工智能直播在近年来得到了广泛应用。 一、人工智能直播的优势 节省成本&#xff1a;相比传统直播&#xff0c;人工智能直播不需要…

校园垃圾回收处理APP

摘 要&#xff1a;本文开发的是校园垃圾分类回收APP。随着互联网的快速发展&#xff0c;现如今使用互联网对信息进行管理这一方法也被各行各业所使用&#xff0c;因为实现信息管理最好的方式就是建立良好的网络管理平台&#xff0c;并对其进行综合管理。与此同时&#xff0c;A…

C++模板类及其应用

C模板类及其应用 在本文中&#xff0c;我们将探讨C中的模板类及其应用。模板类是一种通用的编程技术&#xff0c;它允许您创建可重用的代码&#xff0c;同时保持类型安全和高性能。我们将通过以下几个方面来介绍模板类&#xff1a; 文章目录 C模板类及其应用什么是模板类&…

tomcat集群下的session共享和负载均衡(apache实现)

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jdk&#xff1a;1.8.0_251 apache-http&#xff1a;httpd-2.2.17-win32-x86-no_ssl&#xff0…

rabbitmq集群搭建

rabbitmq集群 环境初始化配置集群配置集群节点通信配置节点加入集群 常用命令集群搭建避坑 节点IPrabbitmq01&#xff08;磁盘节点&#xff09;192.168.200.80rabbitmq02&#xff08;内存节点&#xff09;192.168.200.81rabbitmq03&#xff08;内存节点&#xff09;192.168.200…

【Android开发基础】四大组件之一Service(服务)的应用场景及使用(以实时聊天为例)

文章目录 一、引言1、什么是服务&#xff1f;2、应用场景3、其他类同 二、生命周期三、基础使用1、创建服务2、注册服务3、启动服务 四、进阶使用&#xff08;实时聊天&#xff09;1、实现效果2、数据流图3、服务部分 一、引言 1、什么是服务&#xff1f; Service&#xff08;…

路径规划算法:基于海洋捕食者优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于海洋捕食者优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于海洋捕食者优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

nginx系列第五篇:nginx中相关通信总结

目录 1.master进程监听socket 2.master和worker进程通信机制 2.1通信渠道 2.2通信方法 2.3通信内容 2.4子进程事件处理 3.epoll封装 4.linux系统下信号查看 1.master进程监听socket nginx在master进程socket bind listen&#xff0c;accept在通过epoll在子进程中控制&a…

ThreeJS 炫酷特效旋转多面体Web页 Demo 01《ThreeJS 炫酷特效制作》

本案例为一个 threejs 的特效网页&#xff0c;大小球体进行包裹&#xff0c;外球体为透明材质&#xff0c;但是进行了线框渲染&#xff0c;使其能够通过外球踢查看其内球体。 注&#xff1a;案例参考源于互联网&#xff0c;在此做代码解释&#xff0c;侵删 本案例除 ThreeJS 外…

Kafka原理

生产者原理解析 生产者工作流程图&#xff1a; 一个生产者客户端由两个线程协调运行&#xff0c;这两个线程分别为主线程和 Sender 线程 。 在主线程中由kafkaProducer创建消息&#xff0c;然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器&#xff08;Rec…

uniApp 页面通讯统一解决方案

文章目录 往期回顾统一解决方案uni.on和eventChannel之间的选择如何设置触发器最终范例距离 往期回顾 uniapp 踩坑记录 uni.$on为什么不能修改data里面的数据 uniApp页面通讯大汇总&#xff0c;如何页面之间传值 统一解决方案 uni.on和eventChannel之间的选择 uni.on和eve…