zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

【大数据】Hive SQL执行全过程源码解析(Hive3.1)

SQL源码执行数据 解析 hive 全过程
2023-09-11 14:21:26 时间

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

Hive执行SQL的主要流程图

image.png

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

Hive架构图

image.png

源码解读

由于源码含有非常多的细节,暂时忽略非重要细节

执行SQL的主要入口方法为Driver.runInternal,该方法涉及了整个Hive SQL执行流程,从SQL到编译,解析,执行,收集返回结果。

首先该方法中会判断SQL是否经过编译,若未进行编译,则会调用compileInternal -> compile方法。

image.png

SQL -> compile -> genPlan

org/apache/hadoop/hive/ql/Driver.compile

image.png

对生成的AST进行 分析,生成计划

image.png

AST -> Task

这部分会用到BaseSemanticAnalyzer.analyze,大致流程是先通过SemanticAnalyzerFactory.get(queryState, tree),初始化BaseSemanticAnalyzer对象,并且确定了SQL的类型,SQL的类型以及使用了哪些算子都在org/apache/hadoop/hive/ql/parse/HiveParser.g语法文件中枚举出来了。

然后通过sem.analyze(tree, ctx)调用analyzeInternal

image.png

analyzeInternal是一个抽象方法,有很多种实现:

image.png

具体实现比较复杂,大概意思就是对语法树进行递归,把每个节点用switch枚举匹配,替换成Hive的算子。

Task -> QueryPlan

这部分直接实例化一个QueryPlan对象,实际上就是把上一步的结果给copy出来组成了一个新对象。

image.png

其中存放task的属性未:

  private ArrayList<Task<? extends Serializable>> rootTasks;
  private FetchTask fetchTask;

QueryPlan -> Job

前面部分把编译的流程大致梳理了一遍,现在我们看下任务的提交与执行。

Driver.execute():

image.png

launchTask 会将任务提交到Yarn,先继续往下看:

image.png

最终会调用 TaskRunner.runSequential()

image.png

最终调用task.execute(),而execute是抽象方法,有很多中类型,都有不同的实现。

image.png

image.png

参考 :
https://blog.csdn.net/zyzzxycj/article/details/102861166?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control