千家信息网

Hive的底层执行流程

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"Hive的底层执行流程",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hive的底层执行流程"吧!Hive 底层执行流程我们以下面这个SQ
千家信息网最后更新 2026年11月03日Hive的底层执行流程

本篇内容主要讲解"Hive的底层执行流程",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hive的底层执行流程"吧!

Hive 底层执行流程

我们以下面这个SQL为例

FROM src INSERT OVERWRITE TABLE dest_g1 SELECT src.key, sum(substr(src.value,4)) GROUP BY src.key;

整个编译过程分为六个阶段:
1.Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL
转化为抽象语法树AST Tree

HiveLexerX,HiveParser分别是Antlr对SQL编译后自动生成的词法解析和语法解析类,在这两个类中进行复杂的解析。
例子中的AST tree为

ABSTRACT SYNTAX TREE:(TOK_QUERY (TOK_FROM (TOK_TABREF src))(TOK_INSERT (TOK_DESTINATION (TOK_TAB dest_g1)) (TOK_SELECT (TOK_SELEXPR (TOK_COLREF src key)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_FUNCTION substr (TOK_COLREF src value) 4))))(TOK_GROUPBY (TOK_COLREF src key))))

2.遍历AST Tree,抽象出查询的基本组成单元QueryBlock
AST Tree 仍然非常复杂,不够结构化,不方便直接翻译为 MapReduce 程序, AST
Tree 转化为 QueryBlock(QB)就是将 SQL 进一部抽象和结构化。
AST Tree 生成 QueryBlock 的过程是一个递归的过程,先序遍历 AST Tree ,遇到不
同的Token 节点(理解为特殊标记),保存到相应的属性中,主要包含以下几个过程

TOK_QUERY => 创建 QB 对象,循环递归子节点TOK_FROM => 将表名语法部分保存到 QB 对象的 aliasToTabs 等属性中TOK_INSERT => 循环递归子节点TOK_DESTINATION => 将输出目标的语法部分保存在 QBParseInfo 对象的nameToDest 属性中TOK_SELECT => 分别将查询表达式的语法部分保存在 destToSelExpr 、destToAggregationExprs 、 destToDistinctFuncExprs 三个属性中TOK_WHERE => 将 Where 部分的语法保存在 QBParseInfo 对象的destToWhereExpr 属性中

3.遍历QueryBlock,翻译为执行操作树OperatorTree
Hive 最终生成的 MapReduce 任务, Map 阶段和 Reduce 阶段均由 Operator Tree
组成。逻辑操作符,就是在 Map 阶段或者 Reduce 阶段完成单一特定的操作。
基本的操作符包括
TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator、ReduceSinkOperator
QueryBlock 生成 Operator Tree 就是遍历上一个过程中生成的 QB 和 QBParseInfo
对象的保存
语法的属性,包含如下几个步骤:

QB#aliasToSubq => 有子查询,递归调用QB#aliasToTabs => TableScanOperatorQBParseInfo#joinExpr => QBJoinTree => ReduceSinkOperator + JoinOperatorQBParseInfo#destToWhereExpr => FilterOperatorQBParseInfo#destToGroupby => ReduceSinkOperator +GroupByOperatorQBParseInfo#destToOrderby => ReduceSinkOperator + ExtractOperator

由于 Join/GroupBy/OrderBy 均需要在 Reduce 阶段完成,所以在生成相应操作的Operator 之前都会先生成一个 ReduceSinkOperator ,将字段组合并序列化为 Reduce Key/value,Partition Key
SQL例子翻译成OperatorTree

STAGE PLANS:  Stage: Stage-1    Map Reduce      Alias -> Map Operator Tree:        src            Reduce Output Operator              key expressions:                    expr: key                    type: string              sort order: +              Map-reduce partition columns:                    expr: rand()                    type: double              tag: -1              value expressions:                    expr: substr(value, 4)                    type: string      Reduce Operator Tree:        Group By Operator          aggregations:                expr: sum(UDFToDouble(VALUE.0))          keys:                expr: KEY.0                type: string          mode: partial1          File Output Operator            compressed: false            table:                input format: org.apache.hadoop.mapred.SequenceFileInputFormat                output format: org.apache.hadoop.mapred.SequenceFileOutputFormat                name: binary_table  Stage: Stage-2    Map Reduce      Alias -> Map Operator Tree:        /tmp/hive-zshao/67494501/106593589.10001          Reduce Output Operator            key expressions:                  expr: 0                  type: string            sort order: +            Map-reduce partition columns:                  expr: 0                  type: string            tag: -1            value expressions:                  expr: 1                  type: double      Reduce Operator Tree:        Group By Operator          aggregations:                expr: sum(VALUE.0)          keys:                expr: KEY.0                type: string          mode: final          Select Operator            expressions:                  expr: 0                  type: string                  expr: 1                  type: double            Select Operator              expressions:                    expr: UDFToInteger(0)                    type: int                    expr: 1                    type: double              File Output Operator                compressed: false                table:                    input format: org.apache.hadoop.mapred.TextInputFormat                    output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat                    serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe                    name: dest_g1  Stage: Stage-0    Move Operator      tables:            replace: true            table:                input format: org.apache.hadoop.mapred.TextInputFormat                output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat                serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe                name: dest_g1

4.Logical Optimizer进行OperatorTree变换,合并不必要的
使用ReduceSinkOperator,减少shuffle数据量。大部分逻辑层优化器通过变换 OperatorTree ,合并操作符,达到减少 MapReduce Job ,减少 shuffle 数据量的目的。
5.遍历OperatorTree,翻译为Task tree
OperatorTree 转化为 Task tree的过程分为下面几个阶段

  • 对输出表生成 MoveTask

  • 从 OperatorTree 的其中一个根节点向下深度优先遍历

  • ReduceSinkOperator 标示 Map/Reduce 的界限,多个 Job 间的界限

  • 遍历其他根节点,遇过碰到 JoinOperator 合并 MapReduceTask

  • 生成 StatTask 更新元数据

  • 剪断 Map 与 Reduce 间的 Operator 的关系

6.PhysicalOptimizer 对Task tree优化,生成最终的执行计划

7、执行

以上就是HiveSQL的底层执行流程

打印SQL运行相关信息

我们在开发中,可以使用下面这个语句来打印SQL语句的相关运行信息

EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query

注:我的版本是hive-1.1.0-cdh6.7.0,所以只可用三个可选属性,如果您版本比较高的话,可以去官网查阅对应属性
下面我对三种可选属性进行简单介绍

EXTENDED

EXTENDED:打印SQL解析成AST&Operator Tree最全面的信息

hive (g6_hadoop)> explain EXTENDED insert  OVERWRITE table g6_access_orc_explain select domain,count(1) num from g6_access_orc where traffic>'99900' group by domain;OKExplainABSTRACT SYNTAX TREE:TOK_QUERY   TOK_FROM      TOK_TABREF         TOK_TABNAME            g6_access_orc   TOK_INSERT      TOK_DESTINATION         TOK_TAB            TOK_TABNAME               g6_access_orc_explain      TOK_SELECT         TOK_SELEXPR            TOK_TABLE_OR_COL               domain         TOK_SELEXPR            TOK_FUNCTION               count               1            num      TOK_WHERE         >            TOK_TABLE_OR_COL               traffic            '99900'      TOK_GROUPBY         TOK_TABLE_OR_COL            domainSTAGE DEPENDENCIES:  Stage-1 is a root stage  Stage-0 depends on stages: Stage-1  Stage-2 depends on stages: Stage-0STAGE PLANS:  Stage: Stage-1    Map Reduce      Map Operator Tree:          TableScan            alias: g6_access_orc            Statistics: Num rows: 260326 Data size: 188215698 Basic stats: COMPLETE Column stats: NONE            GatherStats: false            Filter Operator              isSamplingPred: false              predicate: (traffic > 99900) (type: boolean)              Statistics: Num rows: 86775 Data size: 62738325 Basic stats: COMPLETE Column stats: NONE              Select Operator                expressions: domain (type: string)                outputColumnNames: domain                Statistics: Num rows: 86775 Data size: 62738325 Basic stats: COMPLETE Column stats: NONE                Group By Operator                  aggregations: count(1)                  keys: domain (type: string)                  mode: hash                  outputColumnNames: _col0, _col1                  Statistics: Num rows: 86775 Data size: 62738325 Basic stats: COMPLETE Column stats: NONE                  Reduce Output Operator                    key expressions: _col0 (type: string)                    sort order: +                    Map-reduce partition columns: _col0 (type: string)                    Statistics: Num rows: 86775 Data size: 62738325 Basic stats: COMPLETE Column stats: NONE                    tag: -1                    value expressions: _col1 (type: bigint)                    auto parallelism: false      Path -> Alias:        hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc [g6_access_orc]      Path -> Partition:        hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc           Partition            base file name: g6_access_orc            input format: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat            output format: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat            properties:              COLUMN_STATS_ACCURATE true              bucket_count -1              columns cdn,region,level,time,ip,domain,url,traffic              columns.comments               columns.types string:string:string:string:string:string:string:bigint              field.delim                 file.inputformat org.apache.hadoop.hive.ql.io.orc.OrcInputFormat              file.outputformat org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat              location hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc              name g6_hadoop.g6_access_orc              numFiles 1              numRows 260326              rawDataSize 188215698              serialization.ddl struct g6_access_orc { string cdn, string region, string level, string time, string ip, string domain, string url, i64 traffic}              serialization.format                serialization.lib org.apache.hadoop.hive.ql.io.orc.OrcSerde              totalSize 8567798              transient_lastDdlTime 1557676635            serde: org.apache.hadoop.hive.ql.io.orc.OrcSerde              input format: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat              output format: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat              properties:                COLUMN_STATS_ACCURATE true                bucket_count -1                columns cdn,region,level,time,ip,domain,url,traffic                columns.comments                 columns.types string:string:string:string:string:string:string:bigint                field.delim                     file.inputformat org.apache.hadoop.hive.ql.io.orc.OrcInputFormat                file.outputformat org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat                location hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc                name g6_hadoop.g6_access_orc                numFiles 1                numRows 260326                rawDataSize 188215698                serialization.ddl struct g6_access_orc { string cdn, string region, string level, string time, string ip, string domain, string url, i64 traffic}                serialization.format                    serialization.lib org.apache.hadoop.hive.ql.io.orc.OrcSerde                totalSize 8567798                transient_lastDdlTime 1557676635              serde: org.apache.hadoop.hive.ql.io.orc.OrcSerde              name: g6_hadoop.g6_access_orc            name: g6_hadoop.g6_access_orc      Truncated Path -> Alias:        /g6_hadoop.db/g6_access_orc [g6_access_orc]      Needs Tagging: false      Reduce Operator Tree:        Group By Operator          aggregations: count(VALUE._col0)          keys: KEY._col0 (type: string)          mode: mergepartial          outputColumnNames: _col0, _col1          Statistics: Num rows: 43387 Data size: 31368801 Basic stats: COMPLETE Column stats: NONE          File Output Operator            compressed: false            GlobalTableId: 1            directory: hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc_explain/.hive-staging_hive_2019-05-23_23-37-06_889_2210604962026719569-1/-ext-10000            NumFilesPerFileSink: 1            Statistics: Num rows: 43387 Data size: 31368801 Basic stats: COMPLETE Column stats: NONE            Stats Publishing Key Prefix: hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc_explain/.hive-staging_hive_2019-05-23_23-37-06_889_2210604962026719569-1/-ext-10000/            table:                input format: org.apache.hadoop.mapred.TextInputFormat                output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat                properties:                  COLUMN_STATS_ACCURATE true                  bucket_count -1                  columns domain,num                  columns.comments                   columns.types string:bigint                  field.delim |                  file.inputformat org.apache.hadoop.mapred.TextInputFormat                  file.outputformat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat                  location hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc_explain                  name g6_hadoop.g6_access_orc_explain                  numFiles 1                  numRows 7                  rawDataSize 149                  serialization.ddl struct g6_access_orc_explain { string domain, i64 num}                  serialization.format |                  serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe                  totalSize 156                  transient_lastDdlTime 1558661108                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe                name: g6_hadoop.g6_access_orc_explain            TotalFiles: 1            GatherStats: true            MultiFileSpray: false  Stage: Stage-0    Move Operator      tables:          replace: true          source: hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc_explain/.hive-staging_hive_2019-05-23_23-37-06_889_2210604962026719569-1/-ext-10000          table:              input format: org.apache.hadoop.mapred.TextInputFormat              output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat              properties:                COLUMN_STATS_ACCURATE true                bucket_count -1                columns domain,num                columns.comments                 columns.types string:bigint                field.delim |                file.inputformat org.apache.hadoop.mapred.TextInputFormat                file.outputformat org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat                location hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc_explain                name g6_hadoop.g6_access_orc_explain                numFiles 1                numRows 7                rawDataSize 149                serialization.ddl struct g6_access_orc_explain { string domain, i64 num}                serialization.format |                serialization.lib org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe                totalSize 156                transient_lastDdlTime 1558661108              serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe              name: g6_hadoop.g6_access_orc_explain  Stage: Stage-2    Stats-Aggr Operator      Stats Aggregation Key Prefix: hdfs://ruozeclusterg6/user/hive/warehouse/g6_hadoop.db/g6_access_orc_explain/.hive-staging_hive_2019-05-23_23-37-06_889_2210604962026719569-1/-ext-10000/Time taken: 1.359 seconds, Fetched: 198 row(s)

AUTHORIZATION

AUTHORIZATION :打印SQL运行相关权限

hive (g6_hadoop)> explain AUTHORIZATION insert  OVERWRITE table g6_access_orc_explain select domain,count(1) num from g6_access_orc where traffic>'99900' group by domain;OKExplainINPUTS:   g6_hadoop@g6_access_orcOUTPUTS:   g6_hadoop@g6_access_orc_explainCURRENT_USER:   hadoopOPERATION:   QUERYAUTHORIZATION_FAILURES:   No privilege 'Update' found for outputs { database:g6_hadoop, table:g6_access_orc_explain}  No privilege 'Select' found for inputs { database:g6_hadoop, table:g6_access_orc, columnName:domain}Time taken: 0.599 seconds, Fetched: 11 row(s)

DEPENDENCY

DEPENDENCY:打印SQL输入表的相关信息

hive (g6_hadoop)> explain DEPENDENCY insert  OVERWRITE table g6_access_orc_explain select domain,count(1) num from g6_access_orc where traffic>'99900' group by domain;Explain{"input_partitions":[],"input_tables":[{"tablename":"g6_hadoop@g6_access_orc","tabletype":"MANAGED_TABLE"}]}Time taken: 0.135 seconds, Fetched: 1 row(s)

到此,相信大家对"Hive的底层执行流程"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

属性 语法 生成 阶段 过程 底层 流程 对象 节点 信息 就是 递归 查询 操作符 数据 译为 运行 复杂 三个 例子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 保险科技 互联网保险 美国互联网保险保险科技 网络科技有限互联网 互联网科技与金融科技 九亚互联网科技 哈尔滨秒房互联网科技有限公司 互联网公司会议桌创意科技软装饰 深圳国际航运科技和互联网 中国科技互联网公司收入 互联网公司科技股 互联网科技人工智能实验室 佛山市拉法互联网科技有限公司 互联网金融科技公司的优势 互联网界的黑科技 美国五大互联网科技公司市值多少 现代互联网科技公司 六子台科技互联网展会 每日互联网科技新闻 如何强化互联网金融科技 喔噻互联网科技有限公司 互联网科技有限公司经营范围 互联网科技未来 远信互联网科技 互联网科技创新企业排名 中国航天科技大学国际工业互联网 互联网科技与大数据专业 乌苏新华互联网科技做什么的 互联网大会出现的黑科技 现代科技的标志之一的互联网
0