【大数据】Hive SQL执行全过程源码解析(Hive3.1)
Hive执行SQL的主要流程及Hive架构
Hive执行SQL的主要流程图
看着有很多阶段,实际上很简单。Hive就是把SQL通过AST解析,然后遍历若干次(进行算子替换以及优化),最后再次遍历算子,如果为reduceSink操作符则划分出一个stage,类似Spark中通过shuffle来划分stage,生成MapReduce任务。最后将这些任务按照执行计划的顺序提交到Yarn上执行。
Hive架构图
源码解读
由于源码含有非常多的细节,暂时忽略非重要细节
执行SQL的主要入口方法为Driver.runInternal
,该方法涉及了整个Hive SQL执行流程,从SQL到编译,解析,执行,收集返回结果。
首先该方法中会判断SQL是否经过编译,若未进行编译,则会调用compileInternal -> compile方法。
SQL -> compile -> genPlan
org/apache/hadoop/hive/ql/Driver.compile
对生成的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():
launchTask 会将任务提交到Yarn,先继续往下看:
最终会调用 TaskRunner.runSequential()
最终调用task.execute()
,而execute是抽象方法,有很多中类型,都有不同的实现。
相关文章
- SQL Pretty Printer 格式化sql 利器
- Hudi-Flink SQL实时读取Hudi表数据
- SQL LEN() 函数
- SQL With As 用法
- Sql语句用left join 解决多表关联问题(关联套关联,例子和源码)
- SQL中用一句sql语句将数据库中的两列值进行交换
- 第116章 SQL函数 REPLACE
- 数仓工具—Hive源码之SQL解析Antlr进阶(8)
- p6spy打印SQL
- 《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.16 创建索引
- 使用PL/SQL将sql脚本数据导入数据库
- sql server 小技巧(4) Sql server 排序时让空值排在最后
- SQL Server: Get table primary key and Foreign Key using sql query
- Sql Server 优化 SQL 查询:如何写出高性能SQL语句
- SQL Server 存储过程
- [Oracle工程师手记] 利用 DBMS_SQLTUNE.report_sql_monitor 生成 SQL 语句的监控信息
- linux之SQL语句简明教程---表格连接
- (4.61)sql server执行SQL遇到错误不中断
- sql server在group by 中使用 case when
- sql server代理服务无法启动(SQL Agent):OpenSQLServerInstanceRegKey:GetRegKeyAccessMask failed (reason: 2).
- sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)
- sql-如何提高SQL查询的效率?
- SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。