百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

大数据Hive-SQL执行计划解读(explain)

ccwgpt 2025-01-03 14:36 61 浏览 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的执行计划,对学会看懂其它计算引擎的执行计划也是有极大的帮助。


#Hive##大数据#  #SQL#

相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: