很少在博客里写翻译的东西, 这次例外. 原文在这儿
. 译文掺杂了些自己的表述。
解析器(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为操作符树的根结点
相关推荐
使用hive3.1.2和spark...所以,如果想要使用高版本的hive和hadoop,我们要重新编译hive,兼容spark3.0.0。除了兼容spark3.0.0外,还将hive3.1.2的guava的版本进行了提升,和hadoop3.x保持一致,以便兼容hadoop3.1.3。
hive编译源码的资料
补丁文件包,依赖包,hive3.1.2-spark3.0.0和hive3.1.3-spark3.1.3二进制包已经全部放进该压缩
apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)
apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)
atlas hive hook 资源包
hive源码,可以学习hive源码,对于源码有兴趣同学可以下载
HDP3.1.5源码下载—hadoop hbase hive
文章目录hive源码下载地址解压源码包配置pom文件编辑源码编辑UDF函数注册UDF函数编译hive部署编译后的hive包1. 重新部署hive2. 修改原hive hive源码下载地址 hive版本:hive-1.1.0-cdh5.7.0 百度网盘:链接:...
HiveSql后续的编译过程全都基于AST Tree,所以我们想要完整理解hive sql的编译过程,需要前置了解一下antlr是怎么工作的。 HiveLexer.g:词法解析文件,定义了所有用到的token。 HiveParser.g:语法解析文件,实现了...
为解决hive安全问题,重新编译hive源码升级jetty到9.4.24.v20191120
spark-hive_2.11-2.3.0 spark-hive-thriftserver_2.11-2.3.0.jar log4j-2.15.0.jar slf4j-api-1.7.7.jar slf4j-log4j12-1.7.25.jar curator-client-2.4.0.jar curator-framework-2.4.0.jar curator-recipes-2.4.0....
hive-exec-1.2.1.spark2.jar spark2-shell 支持 hive2 hadoop3
基于hive 0.13.1源码编译的hwi包,需要的同学欢迎下载。。。默认放到hive安装目录lib中,具体视hive-site.xml配置而定
解决kettle使用表输出到hive2时,批量提交不起作用导致速度非常慢的问题,重新编译big-data-plugin插件使表输出支持对hive2批量提交,速度由几十条每秒提升到三千条每秒。
这个hivewebUi是从源码编译出来,省去了再次编译的麻烦
本资源是把sqoop的源码按照官方推荐的issue解决方案重新编译后的版本。sqoop-1.4.7.bin__hadoop-2.6.0-2020.0508.tar.gz是已完成编译的tar包。sqoop编译.zip是编译所需要改的配置以及步骤。 各位请二选其一吧。这个...
使用maven重新编译spark2.3.1源码,用以实现hive on spark
org/apache/hadoop/hive/hbase/HBaseStorageHandler版本不一致报错,此jar包为重新编译的源码
源码使用的是apache-tez-0.8.3,对应的hadoop版本2.7.3,源码包中的nodejs的版本是v0.12.3,很难编译通过,最后把nodejs改成了v4.0.0才编译通过tez-ui2模块。