Hive SQL执行全过程源码解析(Hive3.1)

15 篇文章 1 订阅

1、Hive执行SQL的主要流程及Hive架构

Hive执行SQL的主要流程图在这里插入图片描述
看着有很多阶段,实际上很简单。Hive就是把SQL通过AST解析,然后遍历若干次(进行算子替换以及优化),最后再次遍历算子,如果为reduceSink操作符则划分出一个stage,类似Spark中通过shuffle来划分stage,生成MapReduce任务。最后将这些任务按照执行计划的顺序提交到Yarn上执行。

Hive架构图:
在这里插入图片描述

2、源码解析

由于源码中有很多很多细节,本文在分析时会忽略部分不是非常重要的细节。
执行SQL的主要入口方法为Driver.runInternal,该方法涉及了整个Hive SQL执行流程,从SQL到编译,解析,执行,收集返回结果。

首先该方法中会判断SQL是否经过编译,若未进行编译,则会调用compileInternal->compile方法。
在这里插入图片描述
① SQL->compile->获得plan
org/apache/hadoop/hive/ql/Driver.java -> compile方法
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进一步详细看下:
SQL->AST
这部分比较复杂,笔者暂时也没有仔细研究,先略过。
在这里插入图片描述
AST->Task
这部分会用到BaseSemanticAnalyzer.analyze,大致流程是先通过SemanticAnalyzerFactory.get(queryState, tree),初始化BaseSemanticAnalyzer对象,并且确定了该SQL的类型。SQL的类型以及使用了哪些算子都在org/apache/hadoop/hive/ql/parse/HiveParser.g语法文件中枚举出来了。
然后会通过sem.analyze(tree, ctx)调用analyzeInternal
在这里插入图片描述
analyzeInternal是一个抽象方法,有很多种实现:
在这里插入图片描述
具体实现还是比较复杂的,大致上的思路就是上面说的,对语法树进行递归,把每个节点用switch枚举匹配,替换成Hive的算子。

Task->QueryPlan
这部分直接实例化了一个QueryPlan对象,实际上就是把上一步的结果给copy出来组成了一个新对象。
在这里插入图片描述
其中存放task的属性为;
private ArrayList<Task<? extends Serializable>> rootTasks;
private FetchTask fetchTask;

QueryPlan->Job
前面部分把编译的流程大致梳理了一遍,现在我们看下任务的提交与执行。
Driver.execute:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述开始提交任务了:在这里插入图片描述
lauchTask会将任务提交到Yarn,先继续往下看:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到这边,整个链路都跑完了,在控制台的最后一行,也会看到一个熟悉的OK。

那么最后我们来仔细看一下Driver.launchTask,看看任务是怎么被提交到Yarn的:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
无论是否并行执行,都会执行taskRunner.runSequential方法:
在这里插入图片描述
Task.executeTask:
在这里插入图片描述
这边调用的execute是抽象方法,由task类型决定何种实现方法。
在这里插入图片描述
这边就以MapRedTask为例,进行分析:
在这里插入图片描述
获取reducer数量,如果没有明确,则根据input数据量估算:
在这里插入图片描述
在这里插入图片描述
super.execute即ExecDriver.execute:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

向Yarn RM提交任务,之后的逻辑可以参考之前写过的文章MapReduce框架源码解析在这里插入图片描述

3、总结

断断续续花了2周多,终于把Hive整个执行流程注释完了。看上面整理的代码注释,可以了解整个执行过程核心的一些步骤:

首先SQL进入Driver.compile使用ANTLR进行编译,生成AST;
然后使用BaseSemanticAnalyzer.analyze调用语法文件获得初步的执行计划Plan;
之后调用Driver.execute根据Plan生成Job,Job中包含了MapTask和ReduceTask;
最后就是将任务按stage提交到Yarn执行。

  • 16
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Hive SQL执行过程主要包括以下几个步骤: 1. SQL解析:首先,Hive会对用户输入的SQL进行解析,将其转化为Hive内部的抽象语法树(AST)表示形式。这个过程包括词法分析和语法分析,以及对SQL语句中的各个元素进行校验。 2. 语义分析:在语义分析阶段,Hive会对AST进行进一步的处理,包括语义检查、表和列的解析、权限验证等。同时,Hive还会对查询中的表进行统计信息的收集,以便做出优化决策。 3. 查询优化:Hive会根据收集到的统计信息和查询的特性,进行一系列优化操作,包括选择合适的物理执行计划、重排执行顺序、剪枝无用的列和表等。优化的目标是降低执行成本,提高查询性能。 4. 生成执行计划:在生成执行计划阶段,Hive会根据优化后的查询逻辑,生成对应的物理执行计划。这个执行计划通常以MapReduce或Tez的形式表示,其中包含了一系列的Map和Reduce操作、数据的输入输出路径等。 5. 调度执行执行计划生成后,Hive会将该计划提交给底层的计算引擎(如MapReduce或Tez)进行执行。计算引擎会负责根据执行计划指导任务的并行执行,将数据从输入路径读取到内存中,经过一系列的转换和计算操作后,将结果写回到输出路径。 6. 结果返回:计算引擎执行完毕后,Hive会将计算结果返回给Hive的驱动程序(Driver),然后通过用户界面(UI)将结果展示给用户。 综上所述,Hive SQL执行过程包括SQL解析、语义分析、查询优化、生成执行计划、调度执行和结果返回等步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Hive SQL的底层编译过程详解](https://blog.csdn.net/helloHbulie/article/details/117283369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值