`
samuschen
  • 浏览: 406011 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

hive compile-1

    博客分类:
  • hive
阅读更多

HiveApache Hadoop 项目下的一个子项目,是一个底层用Map/Reduce实现的查询引擎,具体的介绍可以查看Hive的wiki

入口

Hive有三种用户接口:CLI、Client(JDBC、ODBC、thrift或其他)和WebUI,如下图所示:
hive arch
图1 Hive的入口

这些用户接口的工作是将用户输入的HQL语句解析成单条命令传递给Driver(包括用户配置,CLI还包括Session信息)。
Driver模块的工作是将HQL语句转化为MapReduce调用,包括主要的三个阶段:
 编译:Compile,生成执行计划
 优化:Optimize,优化执行计划(当前的Hive实现是在执行前做一次唯一的优化,没有反馈的过程,这使得优化工作只能是rule-based,做不到cost-based)。
 执行:Execute,将执行计划提交给Hadoop。
本文主要记录的是Compile过程。

语义解析器

Compile过程的输入是抽象语法树(AST),输出是执行计划。这一过程由Driver调用,但是主要的逻辑在语义解析器中。语义解析器继承自BaseSemanticAnalyser,对每一种HQL命令,有对应的语义解析器类,包括下列:
表1 HQL命令对应的语义解析器

类					HQL命令类别					Task
DCLSemanticAnalyzer		DCL						(taobao dist only)	DCLTask
DDLSemanticAnalyzer		DDL						DDLTask
ExplainSemanticAnalyzer	Explain					ExplainTask
FunctionSemanticAnalyzer							FunctionTask
LoadSemanticAnalyzer		Load						CopyTask
MoveTask
SemanticAnalyzer	DML		FetchTask
ConditionalTask
MapRedTask
UserSemanticAnalyzer		UserTask

语义解析器的工厂类SemanticAnalyzerFactory负责分发解析任务,它按照AST根节点的类别生成对应的解析器。
语义解析器部分的类图:
analyser

生成Operator树

下面以一个select语句为例解析Compile的过程:
SELECT
s.name name, count(o.amount) sum_order, sum(o.amount) sum_amount
FROM t_sale s LEFT OUTER JOIN t_order o ON (s.id = o.sale_id)
GROUP BY s.id, s.name

如上所述,select语句由SemanticAnalyzer解析。其他的语义解析器较为简单略去不讲。这一查询语句的AST画出来类似这样:

Operator抽象了Hive中的一次操作。首先看一下上面的命令的执行计划

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        s
          TableScan
            alias: s
            Reduce Output Operator
              key expressions:
                    expr: id
                    type: int
              sort order: +
              Map-reduce partition columns:
                    expr: id
                    type: int
              tag: 0
              value expressions:
                    expr: id
                    type: int
                    expr: name
                    type: string
        o
          TableScan
            alias: o
            Reduce Output Operator
              key expressions:
                    expr: sale_id
                    type: int
              sort order: +
              Map-reduce partition columns:
                    expr: sale_id
                    type: int
              tag: 1
              value expressions:
                    expr: amount
                    type: int
      Reduce Operator Tree:
        Join Operator
          condition map:
               Left Outer Join0 to 1
          condition expressions:
            0 {VALUE._col0} {VALUE._col1}
            1 {VALUE._col4}
          outputColumnNames: _col0, _col1, _col7
          Select Operator
            expressions:
                  expr: _col0
                  type: int
                  expr: _col1
                  type: string
                  expr: _col7
                  type: int
            outputColumnNames: _col0, _col1, _col7
            Group By Operator
              aggregations:
                    expr: count(_col7)
                    expr: sum(_col7)
              keys:
                    expr: _col0
                    type: int
                    expr: _col1
                    type: string
              mode: hash
              outputColumnNames: _col0, _col1, _col2, _col3
              File Output Operator
                compressed: false
                GlobalTableId: 0
                table:
                    input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                    output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat

  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        hdfs://hdpnn.cm3:9000/group/tbdev/shaojie/hive-tmp/1908438422/10002
            Reduce Output Operator
              key expressions:
                    expr: _col0
                    type: int
                    expr: _col1
                    type: string
              sort order: ++
              Map-reduce partition columns:
                    expr: _col0
                    type: int
                    expr: _col1
                    type: string
              tag: -1
              value expressions:
                    expr: _col2
                    type: bigint
                    expr: _col3
                    type: bigint
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: count(VALUE._col0)
                expr: sum(VALUE._col1)
          keys:
                expr: KEY._col0
                type: int
                expr: KEY._col1
                type: string
          mode: mergepartial
          outputColumnNames: _col0, _col1, _col2, _col3
          Select Operator
            expressions:
                  expr: _col1
                  type: string
                  expr: _col2
                  type: bigint
                  expr: _col3
                  type: bigint
            outputColumnNames: _col0, _col1, _col2
            File Output Operator
              compressed: true
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

  Stage: Stage-0
    Fetch Operator
      limit: -1

可以看到,上面的查询语句包含FilterOperator、SelectOperator等多个Operator,且Operator节点之间构成一颗Operator树。以后我们还会多次回顾这个执行计划。
PS:严格意义上的Operator节点之间的关系构成的结构是一个图。用树结构来描述语法是很自然的,例如AST,但树结构不足以描述语义,示例的 SELECT命令中,需要两次扫描表的操作,join操作需要基于扫描表的结果进行,这在Operator树中描述为“JoinOperator的父节点 为t_order表TableScan和t_sale表TableScan(多个父节点)”。
除了上述情况外,Operator树一般是退化为链表的树形结构,例外是所有的子查询又会是一颗子树。
SemanticAnalyzer通过一系列genXXXPlan方法来生成这颗Operator树。

分享到:
评论

相关推荐

    07--Hive权限管理1

    1. 基于存储的授权(Storage Based Authorization in the Metastore Server) 这种授权模型主要在Metastore服务器上进行,允许对元数据进行保护,但并不提供列级别或行级别的精细访问控制。这意味着用户对表的整体...

    hive编译源码的资料

    1. **环境准备**: - Java环境:确保系统已经安装了Java JDK 8或以上版本,因为Hive需要Java环境来编译和运行。 - Maven:Hive的构建工具是Maven,需要确保Maven已安装并且配置好环境变量。 - Hadoop:Hive是建立...

    谷歌师兄的leetcode刷题笔记-smoker:当你访问你的蜂巢时,带上你的吸烟者,你会少被蜇到

    compile lein uberjar scp build/smoker-1.0.0-SNAPSHOT-standalone.jar myserver:~/hive-jars/smoker-standalone.jar 然后在 Hive 中使用它: # on your server, start hive with auxpath hive --auxpath /home/...

    hive-query-parser:解析配置单元SQL

    HQL解析器 解析HQL获取源表和目标表 开发者 $ git clone https://github.com/FOuR-/HiveParser.git $ cd HiveParser $ sbt clean compile // import ide $ sbt eclipse

    Hive脚本任务参数优化配置.doc

    - `set hive.optimize.skewjoin.compiletime=true;` 在编译时启用数据倾斜优化,进一步提升优化效果。 8. **Group By优化**: - `set hive.map.aggr=true;` 开启Map端聚合,减少传递给Reduce端的数据量。 - `set...

    ImpalaJDBC41.zip

    "Hive 2.1.1-cdh6.2.0 驱动文件"则意味着压缩包还包含了与Hive相关的JDBC驱动,版本为2.1.1,同样适应于CDH 6.2.0。Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询...

    cascading.hive:提供对Cascading中Hive原生文件格式读写数据的支持

    <scope>compile 蜂巢版本 目前,该模块适用于 Apache Hive 0.12(版本 0.0.2-SNAPSHOT)和 0.13(版本 0.0.3-SNAPSHOT 及更高版本)。 如果要与其他版本的 Hive 一起使用,则需要修补。 投影下推 RC 和 ORC

    flink-1.8.1_after_compile.tar.gz

    2. **SQL 和 Table API**:进一步提升了 SQL 支持,增强了与 JDBC、Hive 等外部系统的集成。 3. **状态后端**:增强了对 RocksDB 状态后端的支持,提供更高效的状态存储和查询。 4. **连接器和格式**:增加了对更多...

    DungeonCrawler

    地牢爬行者 要从根目录进行编译: mvn clean compile assembly:single 要从根目录运行: java -jar target/hive-rpg-1.0-SNAPSHOT-jar-with-dependencies.jar

    jdbc-examples

    mvn clean compile 要运行Hive示例: mvn exec:java -Dexec.mainClass=com.example.ClouderaJDBCHiveExample 和Impala示例: mvn exec:java -Dexec.mainClass=com.example.ClouderaJDBCImpalaExample

    spark源代码部署及编译生成

    1. **获取Spark源代码** Spark的源代码可以通过访问Apache官方网站或使用Git克隆仓库来获取。在终端中输入以下命令克隆Spark的GitHub仓库: ``` git clone https://github.com/apache/spark.git ``` 2. **...

    A2Epoch_Logistic

    SKARONATOR @ - 帮助我完成 hive 写入 Jeff @ - 法语翻译 Blite - 德语翻译重做 Anarior - 拖车重做 1.) 解压“zip”并将“logistic”文件夹复制到“/MPMissions/DayZ_Epoch.Map”文件夹。 2.) 在您的任务文件夹中...

    字符串截取

    Pattern p = Pattern.compile("^[\u4e00-\u9fa5]$"); // 正则表达式,用于匹配中文字符 int i = 0, j = 0; int sublength = length - ((endStr == null) ? 0 : endStr.getBytes(charset).length); // 计算实际...

    Hadoop集群上Snappy压缩算法的安装配置

    Snappy 压缩算法可以应用于多种数据处理场景,包括 Hadoop、HBase、 Hive 等。 二、 前置条件 在安装 Snappy 压缩算法之前,需要满足以下前置条件: 1. 安装 gcc,版本为 4.4.x,高于 4.4.x 的版本可能会出现不...

    精选_大数据Hadoop平台2-2、MapReduce_源码打包

    3. **编译源码**:进入源码目录,使用Maven的`mvn compile`命令编译源代码,这会生成相应的class文件。 4. **打包成JAR**:使用`mvn package`命令,Maven会将编译后的class文件打包成一个或多个JAR文件,这些JAR...

    spark2.3源码下载

    1. **DataFrame/Dataset增强**:在Spark 2.3.0中,DataFrame和Dataset API进一步完善,支持更多SQL操作,如窗口函数和多级GROUP BY,同时提升了查询优化和性能。 2. **结构化流处理**:这个版本强化了Structured ...

Global site tag (gtag.js) - Google Analytics