hiveql的执行过程

     周末花了点时间,结合以前看的,大体看了一下 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 包中的HiveLexerHiveParser 完成词法和语法分析工作。

       语义分析:根据不同的类型的语句生成不同的语法,所以有个抽象语义分析类 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 对象来包装起来,且可以序列化的,相信其他数据库的计划也是某种语言的对象来保存的。

你可能感兴趣的:(mapreduce,sql,hadoop,数据库,优化,command)