Hive 执行过程源码分析

周末花了点时间,结合以前看的,大体看了一下 Hive 源码,主要包括 客户 / 服务器通信 ,语法解析器,语义分析器,逻辑计划生成器,计划优化器,物理计划生成器,物理计划执行器等部分。分别由包 parse,plan, optimizer, Exec 中的代码来实现的。

       Hive 是将 SQL 语句转换成 hadoop 的 MapReduce 程序,通常在客户端执行 hive 命令,然后输入 SQL 语句后, hive 将 SQL 语句生成多个 MR 的 job ,然后将这些 job 提交给 hadoop 进行执行,完成后,再把结果放入到 hdfs 或者本地的临时文件中。 Hive 中的表结构信息都是保存在关系型数据库中,如 mysql,derby 等,可以通过 hive-site.xml 中配置数据库的 URL, 用户名,密码等。而表的实际数据内容保存在 hadoop 的 hdfs 文件中,行和列数据分别用特殊字符串分格开,以便能够读取数据,默认是用 ctrl+a 和 \n 来分隔。

       客户 / 服务器通信:由 org.apache.hadoop.hive.ql 包中的 Driver 类来完成,该类主要有一个 run(command) 方法,而该方法主要有二个方法组成:

int ret = compile(command); 此方法主要完成语法,语义,计划生成。

ret = execute(); 执行物理计划,即提交相应的 job 给 hadoop 进行执行。

执行完成后,会将执行结果通过 CommandProcessorResponse 类包装返回给客户端。

另外,在hive 中,提供本地直接运行hive 命令,也提交了jdbc 访问。具体实现分别在对应的包里。

       语法分析器:将 sql 语句转换成一颗语法树,像编译原理书上讲的,其实就是一个普通树,只不过这颗保存了 sql 语句的结构,而hive 是用 anltr 自动生成的语法树。分别由 org.apache.hadoop.hive.ql.parse 包中的HiveLexer 和HiveParser 完成词法和语法分析工作。

       语义分析:根据不同的类型的语句生成不同的语法,所以有个抽象语义分析类 BaseSemanticAnalyzer ,分别有以下子类,对应于不同类型的语句:

ExplainSemanticAnalyzer

ExplainSemanticAnalyzer

LoadSemanticAnalyzer

DDLSemanticAnalyzer

FunctionSemanticAnalyzer

SemanticAnalyzer

       语义分析完成后,会将语句中的相应信息放入到 org.apache.hadoop.hive .ql.plan 包中 *Desc 类中,这些类记录了相应语句的基本信息。

       然后会对语义完了的信息进行验证,比如表是否存在,字段是否存在,这时需要查询元数据,同时将表的相关信息放到 desc 对象中。

逻辑计划生成器:根据语义分析后的相关信息,将生成出逻辑操作树,抽象类为 Operator 。子类有:

ExtractOperator

FilterOperator

ForwardOperator

GroupbyOperator

LateralViewJoinOperator

LimitOperator

MapOperator

ScriptOperator

SelectOperator

TableScanOperator

TerminalOperator-Base Class

FileSinkOperator

ReduceSinkOperator

UDTFOperator

UnionOperator

计划优化器:将操作树进行一些优化,主要是基于规则的优化。这部分,这次我略过了,下次再讲解。

物理计划生成器:根据逻辑操作树生成出物理计划树,这个物理计划是由 Task 对象来包装的,而 Task 类会有一个 Work 对象, Work 类是物理计划的描述,当 task 对象执行时,通常需要用到 work 对象上的相关信息。

Work 子类有:

FetchWork 

MoveWork

MapredWork

CopyWork

DDLWork

FunctionWork

ExplainWork

ConditionalWork

物理计划执行器:就是将一颗含有 Task 类对象的树,进行从上到下执行。分别调用该对象的 execute() 方法,而该方法会完成相应的物理计划执行工作。主要有:

FetchTask

ConditionalTask

CopyTask

DDLTask

ExplainTask

MapRedTask

MoveTask

每个类都表示一种物理计划。如 FetchTask 就是从 hdfs 或者本地文件中取出表或视图的记录。

       总结, Hive 跟大多数的关系数据库类似的,有相同的步骤来完成从语句到最后物理执行。不同的是 Hive 的执行是在 hadoop 的 MR程序来执行。同时在这个过程中的,操作类,计划类都是由 Java 对象来包装起来,且可以序列化的,相信其他数据库的计划也是某种语言的对象来保存的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive SQL 的执行流程可以分为三个主要步骤。首先,Hive 会将用户编写的 SQL 语句进行词法分析和语法分析,生成一个抽象语法树(AST)表示用户查询的结构。这个过程叫做查询解析。在这个过程中,Hive 将 SQL 语句转化为一个 QueryBlock 对象,用来表示查询的结构和语义。 接下来,Hive 会对 QueryBlock 进行语义分析,检查查询中的表、列、函数等是否存在以及其它语义上的错误。在这个步骤中,Hive 还会进行表的访问控制和权限检查。一旦通过了语义分析Hive 就会生成一个逻辑查询计划(Logical Plan)。逻辑查询计划描述了查询的逻辑操作,例如选择、投影和连接等。 最后,Hive 会将逻辑查询计划转化为物理查询计划(Physical Plan),并生成对应的 MapReduce 程序。这个过程叫做查询优化和执行计划生成。在这个步骤中,Hive 会进行各种优化,例如谓词下推、列裁剪和任务并行化等,以提高查询的性能。最终,Hive 会将生成的 MapReduce 程序提交给底层的计算引擎进行执行,计算结果将返回给用户。 综上所述,Hive SQL 的执行流程包括查询解析、语义分析和查询优化及执行计划生成三个主要步骤。通过这些步骤,Hive 能够将用户编写的 SQL 转化为 MapReduce 等计算引擎可识别的程序,并实现查询的执行。<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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值