zoukankan      html  css  js  c++  java
  • hive源码结构分析(编译器)

    本文转自:http://samuschen.iteye.com/blog/860809

    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 对象来包装起来,且可以序列化的,相信其他数据库的计划也是某种语言的对象来保存的。

  • 相关阅读:
    构建之法读书笔记04
    团队冲刺06
    12.23——周总
    团队冲刺05
    团队冲刺04
    用户场景分析
    团队冲刺03
    返回一个二维数组中最大联通子数组的和
    团队冲刺02
    FFT/NTT基础题总结
  • 原文地址:https://www.cnblogs.com/java20130722/p/3206982.html
Copyright © 2011-2022 走看看