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

hive编译部分的源码结构

    博客分类:
  • hive
阅读更多

很少在博客里写翻译的东西, 这次例外. 原文在这儿 . 译文掺杂了些自己的表述。

解析器(Parser)

解析器 由antlr生成, 文法定义在Hive.g文件中。它的功能是将查询字符串翻译成抽象语法树(Abstract Syntax Tree, 简称AST).

语法分析器(Semantic Analyzer)

语法分析器将AST转换成内部查询形式,此形式为查询块(Query Block), 而不是一棵操作符树(Opertator Tree). 它还验证查询语句中的列名, 符号"*" 等. 同时这一环节还进行类型检查, 隐式类型转换. 如果被查询的表是带分区(Partition)的表,则所有关于该表的表达式都将被收集起来,以备裁剪不必要的分区时使用;如果查询语句包含采样 (Sampling)操作,也会收集这些表达式.

逻辑计划生成器(Logic Plan Generator)

逻辑计划生成器将内部查询形式(即上文提到过的查询块)转换成逻辑计划。逻辑计划是一棵操作符树。其中部分操作符是关系代数操作符,例如 filter, join操作符。还有部分操作符是hive特有的操作符,它们将被翻译为mapreduce作业, 例如, reduceSink操作符。它出现在map与reduce的分界处。
此环节还包含优化器。优化器修改查询计划以提高查询的效率。例如: 把一系列join操作合并到一个join中; group by操作的map端聚合; 将group by分为两步,以防数据倾斜,造成某个reducer负担过重,成为瓶颈。
每个操作符,都包含一个描述符(descriptor)。描述符是可序列化的对象。

查询计划生成器(Query Plan Generator)

即数据库理论中的物理查询计划生成器。它将逻辑计划转换成一系列的map-reduce任务(见ql/exec/MapRedTask类)。具体操 作是递归访问操作符树,将它们分成一系列序列化的map-reduce任务, 然后将任务提交给hadoop分布式系统。 reduceSink是map与reduce的分界线,它的描述符包含归约键(reduction keys), 归约键是mapper的输出键, 即也是reduce的输入键。如果查询中包含采样/分区, 则也会有相应的计划。计划被序列化到一个plan.[0-9]+文件里, 它是一个xml格式的文件。

 

 

Distinct的改造

SemanticAnalyzer.genGroupByPlanReduceSink() 方法根据GroupBy与distinct function信息组合成了redcueKeys,再将它放入reduceSinkDesc对象中(reduceSinkDesc.keyCols). 这个keyCols的类型是ArrayList<exprNodeDesc>,即表达式数组,其实它应该为一个 ArrayList<ArrayList<exprNodeDesc>> 或者HashMap<String, ArrayList<exprNodeDesc>>以支持多种key输出

 

reduceSinkDesc被ExecDriver序列化提交到hive.scratchdir目录下的plan.[0-9]+文件. hive.scratchdir一般在hive-site.xml中定义,是hive在hdfs上的一个存放临时文件的目录. ExecMapper与ExecReduce在configure的时候, 会读取这些plan.[0-9]+文件, 反序列化mapRedWork对象, 初始化各Operator等.

 

将ReduceSinkOperator.keyEval改成ExprNodeEvaluator[][]的二维数组以支持多个key输出

Map会以MapOperator为操作符树的根结点, Reduce一般以GroupByOperator为操作符树的根结点

分享到:
评论
1 楼 秦时明月黑 2013-09-21  
深入浅出,楼主很有功底

相关推荐

    Hive3.1.2编译源码

    使用hive3.1.2和spark...所以,如果想要使用高版本的hive和hadoop,我们要重新编译hive,兼容spark3.0.0。除了兼容spark3.0.0外,还将hive3.1.2的guava的版本进行了提升,和hadoop3.x保持一致,以便兼容hadoop3.1.3。

    hive3.x编译spark3.x包

    2. **获取源码**:从Apache官网下载Hive和Spark的源代码。对于Hive,选择3.1.x系列的分支,对于Spark,选择3.0.0或3.1.3版本,这取决于你希望编译的Hive-Spark组合。 3. **应用补丁**:描述中提到的“补丁文件包”...

    hive编译源码的资料

    - 从Apache官方网站或者Git仓库(如GitHub)克隆或下载Hive的最新源代码。 3. **配置环境**: - 修改`pom.xml`:在Hive源码根目录下,你需要根据你的Hadoop版本和系统环境修改`pom.xml`中的依赖版本。 - 设置...

    apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)

    Hive的源码使用Maven进行管理,编译过程包括下载依赖、编译源码、生成JAR文件等步骤。源码包中已经包含了编译好的结果,可以直接用于研究或部署。 4. **Hive的表和分区** Hive支持动态和静态分区,通过分区可以将...

    HiveSQL编译原理

    HiveSQL编译原理是大数据处理领域中的一个重要概念,它主要涉及到如何将用户提交的SQL语句转换为可执行的MapReduce或者Tez...在实际工作中,Java开发者可以通过深入研究Hive的源代码,进一步定制和优化SQL编译过程。

    apache-hive-1.2.1源码包(已编译)(含Hive的使用全解).tar.gz

    apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)

    atlas hive hook 编译依赖 apache-atlas-1.2.0-hive-hook.tar.gz

    Apache Atlas 是一个元数据管理框架,它...这可能包括编译源代码、添加依赖、修改 Hive 配置以及启动服务。通过正确配置和使用 Atlas Hive Hook,你可以大大提高数据治理的能力,确保大数据环境的可管理性和合规性。

    apache-hive-1.2.2-bin_编译版本.tar.gz

    这个压缩包包含了运行 Hive 所需的所有组件和库,用户可以直接解压并安装,而无需自己编译源代码。 在使用这个压缩包之前,确保你已经安装了 Hadoop 环境,因为 Hive 是构建在 Hadoop 生态系统之上的。Hadoop 包括 ...

    hive2.0源码

    1. **元存储(Metastore)**:这是Hive用于存储元数据的地方,如表结构、分区信息等。在Hive 2.0中,元存储服务可以通过Thrift API远程访问,支持更灵活的部署模型。 2. **编译器(Compiler)**:Hive的HQL查询首先...

    HDP3.1.5源码下载—hadoop hbase hive

    标题中的“HDP3.1.5源码下载—hadoop hbase hive”指的是Hortonworks Data Platform(HDP)的3.1.5版本,它是一个全面的大数据解决方案,包含了对Hadoop、HBase和Hive等组件的源代码支持。这个版本是大数据开发者和...

    spark2.0编译版-适用于hive2.3的hive on spark

    2. **编译过程**:由于Hive on Spark要求Spark不包含Hive的jar包,因此需要从源代码编译Spark。这通常涉及以下步骤: - 克隆Spark的GitHub仓库到本地。 - 修改`build.sbt`或`pom.xml`配置文件,排除Hive相关的依赖...

    hive3.1.2编译.doc

    这个过程涉及到解决依赖冲突、修改源代码以及适应新版本的Spark和Hadoop。以下是一步步的详细步骤: 首先,确保你已经准备好了必要的环境。这包括安装了Maven构建工具,你可以从Apache官方网站下载Maven并按照指示...

    编译hive源码-UDF函数

    文章目录hive源码下载地址解压源码包配置pom文件编辑源码编辑UDF函数注册UDF函数编译hive部署编译后的hive包1. 重新部署hive2. 修改原hive hive源码下载地址 hive版本:hive-1.1.0-cdh5.7.0 百度网盘:链接:...

    hive源码分析

    ### Hive源码分析 #### 背景与概述 Hive是Facebook开发的一款数据仓库工具,用于处理存储在Hadoop文件系统中的大量数据集。它通过提供SQL-like语言HiveQL来简化对这些数据的查询过程。本文将深入剖析Hive 0.7.1...

    apache-hive-3.1.2-bin.tar.gz

    升级Jetty的过程可能包括下载源码,修改pom.xml文件以指定新版本,编译源码,然后将新编译的Jetty库替换到Hive的lib目录下。同时,也需要更新Hive的配置文件,确保与新版本Jetty的兼容性。 总的来说,Hive 3.1.2的...

    编译好的Atlas服务和HIVE-hook

    至于“编译好的Atlas2.1.0”,这可能是指除了上述两个tar.gz压缩包之外,还提供了已经编译完成的 Atlas 2.1.0二进制文件,用户可以直接使用,而无需自行编译源代码,这对于不熟悉构建过程或者没有合适开发环境的用户...

    hive相关jar包

    4. **Hive Execution Engine**:这部分jar包包含Hive的执行引擎,它负责将编译后的查询计划转化为MapReduce或Tez或Spark的任务,以便在Hadoop集群上执行。 5. **Hadoop相关依赖**:由于Hive是构建在Hadoop之上的,...

    Hive 性能测试程序,https://github.com/hortonworks/hive-testbench 编译

    4. **构建项目**: 使用 Maven 编译源代码,命令如下: ``` cd hive-testbench mvn clean install ``` 5. **运行测试**: 编译完成后,可以运行提供的测试用例,例如数据加载、查询执行等,以评估 Hive 的性能。 ...

    java操作Hive源码之HiveJDBC实例(mysql数据库)

    在Java编程环境中,与Hive进行交互通常涉及使用Hive JDBC驱动程序,这是一种允许Java应用程序通过JDBC(Java Database Connectivity)接口与Hadoop上的Hive数据仓库进行通信的方式。本实例将聚焦于如何使用Java和...

Global site tag (gtag.js) - Google Analytics