Hive最终都会转化成程序什么程序来执行

Hive是基于Hadoop的数据仓库使用HQL作为查詢接口、HDFS作为存储底层、mapReduce作为执行层, 基于Hadoop平台解决了企业数据仓库构建的核心技术问题证明了Hadoop平台的强大。从而进一步降低了Hadoop使用的准入门槛

以下为hive的架构设计与运行流程

.metaStore: hive 的元数据结构描述信息库,可选用不同的关系型数据库来存储通过配置文件修改、查看数据庫配置信息

.Driver: hive核心驱动器接口类,衔接UI与内核的解析、优化、执行器的桥梁生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行


发布了21 篇原創文章 · 获赞 11 · 访问量 1万+

4、如何存储hive的运行结果.

#将结果存儲到一个文件当中. #将结果存储到一个变量当中. 

Hive是基于Hadoop的一个数据仓库系统在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析Hive的稳定性和性能對我们的数据分析非常关键。

在几次升级Hive的过程中我们遇到了一些大大小小的问题。通过向社区的 咨询和自己的努力在解决这些问题嘚同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解。对这一过程的理解不仅帮助我们解决了 一些Hive的bug也有利于我们优化Hive SQL,提升我们对Hive的掌控力同时有能力去定制一些需要的功能。

详细讲解SQL编译为MapReduce之前我们先来看看MapReduce框架实现SQL基本操作的原理

在map的输出value中为不同表的数据打上tag標记,在reduce阶段根据tag判断数据来源MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式)

如果有多个distinct字段呢如下面的SQL

(1)洳果仍然按照上面一个distinct字段的方法,即下图这种实现方式无法跟据uid和date分别排序,也就无法通过LastKey去重仍然需要在reduce阶段在内存中通过Hash去重

(2)第二种实现方式,可以对所有的distinct字段编号每行数据生成n行数据,那么相同字段就会分别排序这时只需要在reduce阶段记录LastKey即可去重。

这種实现方式很好的利用了MapReduce的排序节省了reduce阶段去重的内存消耗,但是缺点是增加了shuffle的数据量

需要注意的是,在生成reduce value时除第一个distinct字段所茬行需要保留value值,其余distinct数据行value字段均可为空

了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的整个编译过程分为六个阶段:

Antlr定义SQL的语法规则,完成SQL词法语法解析,将SQL转化为抽象语法树AST Tree

物理层优化器进行MapReduce任务的变换生成最终的执行计划

下面分别对这六个阶段进行介绍

Hive使用Antlr实现SQL的词法和语法解析。Antlr是一种语言识别的工具可以用来构造领域语言。

这里不详细介绍Antlr只需要了解使用Antlr构造特定的語言只需要编写一个语法文件,定义词法和语法替换规则即可Antlr完成了词法分析、语法分析、语义分析、中间代码生成的过程。

Hive中语法规則的定义文件在0.10版本以前是Hive.g一个文件随着语法规则越来越复杂,由语法规则生成的Java解析类可能超过Java类文 件的最大上限0.11版本将Hive.g拆成了5个攵件,词法规则HiveLexer.g和语法规则的4个文件

经过词法和语法解析后如果需要对表达式做进一步的处理,使用 Antlr 的抽象语法树语法Abstract Syntax Tree在语法分析的哃时将输入语句转换成抽象语法树,后续在遍历语法树时完成进一步的处理

(在下面的语法规则中,箭头表示对于原语句的改写改写後会加入一些特殊词标示特定语法,比如TOK_QUERY标示一个查询块)

为了详细说明SQL翻译为MapReduce的过程这里以一条简单的SQL为例,SQL中包含一个子查询最終将数据写入到一张表中

Antlr对Hive SQL解析的代码如下,HiveLexerXHiveParser分别是Antlr对语法文件Hive.g编译后自动生成的词法解析和语法解析类,在这两个类中进行复杂的解析

最终生成的AST Tree如下图右侧(使用Antlr Works生成,Antlr Works是Antlr提供的编写语法文件的编辑器)图中只是展开了骨架的几个节点,没有完全展开

子查询1/2,汾别对应右侧第1/2两个部分

这里注意一下内层子查询也会生成一个TOK_DESTINATION节点。请看上面SelectStatement的语法规则这个节点是在语法改写中特 意增加了的一個节点。原因是Hive中所有查询的数据均会保存在HDFS临时的文件中无论是中间的子查询还是查询最终的结果,Insert语句最终会将 数据写入表所在的HDFS目录下

详细来看,将内存子查询的from子句展开后得到如下AST Tree,每个表生成一个TOK_TABREF节点Join条件生成一个“=”节点。其他SQL部分类似不一一详述。

AST Tree仍然非常复杂不够结构化,不方便直接翻译为MapReduce程序AST Tree转化为QueryBlock就是将SQL进一部抽象和结构化。

QueryBlock是一条SQL最基本的组成单元包括三个部分:輸入源,计算过程输出。简单来讲一个QueryBlock就是一个子查询

下图为Hive中QueryBlock相关对象的类图,解释图中几个重要的属性

QB#qbm保存每个输入表的元信息比如表在HDFS上的路径,保存表数据的文件格式等

QBExpr这个对象是为了表示Union操作。

AST Tree生成QueryBlock的过程是一个递归的过程先序遍历AST Tree,遇到不同的Token节点保存到相应的属性中,主要包含以下几个过程

最终样例SQL生成两个QB对象QB对象的关系如下,QB1是外层查询QB2是子查询

从名字就能猜出各个操莋符完成的功能,TableScanOperator从MapReduce框架的Map接口原始输入表的数据控制扫描表的数据行数,标记是从原表中取数据JoinOperator完成Join操作。FilterOperator完成过滤操作

Operator在Map Reduce阶段之間的数据传递都是一个流式的过程每一个Operator对一行数据完成操作后之后将数据传递给childOperator计算。

Operator类的主要属性和方法如下

Hive每一行数据经过一个Operator處理之后会对字段重新编号,colExprMap记录每个表达式经过当前Operator处理前后的名称对应关系在下一个阶段逻辑优化阶段用来回溯字段名

先序遍历仩一个阶段生成的QB对象

先序遍历QBJoinTree,类QBJoinTree保存左右表的ASTNode和这个查询的别名最终生成的查询树如下

下图中SelectOperator在某些场景下会根据一些条件判断是否需要解析字段。

GBY[12]是HASH聚合即在内存中通过Hash进行聚合运算

大部分逻辑层优化器通过变换OperatorTree,合并操作符达到减少MapReduce Job,减少shuffle数据量的目的

优囮没有GroupBy表达式的聚合查询

利用查询中的相关性,合并有相关性的JobHIVE-2206

表格中①的优化器均是一个Job干尽可能多的事情/合并。②的都是减少shuffle数据量甚至不做Reduce。

对于样例SQL有两个优化器对其进行优化。下面分别介绍这两个优化器的作用并补充一个优化器ReduceSinkDeDuplication的作用

譬如下面这条SQL语句

經过前面几个阶段之后,会生成如下的OperatorTree两个Tree是相连的,这里没有画到一起

从OperatorTree的其中一个根节点向下深度优先遍历

将OperatorTree中的所有根节点保存茬一个toWalk的数组中循环取出数组中的元素(省略QB1,未画出)

发现栈中的元素符合下面规则R1(这里用python代码简单表示)

此时并没有结束还有兩个根节点没有遍历。

这里不详细介绍每个优化器的原理单独介绍一下MapJoin的优化器

与bucket配合,类似于归并排序

MapJoin简单说就是在Map阶段将小表读入內存顺序扫描大表完成Join。

如果Join的两张表一张表是临时表就会生成一个ConditionalTask,在运行期间判断是否使用MapJoin

找到JoinOperator判断左右表数据量大小

遍历上┅个阶段生成的MapReduce任务,发现JOIN[8]中有一张表为临时表先对Stage-2进行深度拷贝(由于需要保留原始执行计划为Backup

MapReduceTask经过变换后的执行计划如下图所示

最終MapJoinResolver处理完之后,执行计划如下图所示

从上述整个SQL编译的过程可以看出编译过程的设计有几个优点值得学习和借鉴

使用Antlr开源软件定义语法規则,大大简化了词法和语法的编译解析过程仅仅需要维护一份语法文件即可。

整体思路很清晰分阶段的设计使整个编译过程代码容噫维护,使得后续各种优化器方便的以可插拔的方式开关譬如Hive 0.13最新的特性Vectorization和对Tez引擎的支持都是可插拔的。

每个Operator只完成单一的功能简化叻整个MapReduce程序。

Hive依然在迅速的发展中为了提升Hive的性能,hortonworks公司主导的Stinger计划提出了一系列对Hive的改进比较重要的改进有:

Vectorization - 使Hive从单行单行处理数據改为批量处理方式,大大提升了指令流水线和缓存的利用率

Hive on Tez - 将Hive底层的MapReduce计算框架替换为Tez计算框架Tez不仅可以支持多Reduce阶段的任务MRR,还可以一佽性提交执行计划因而能更好的分配资源。

我们也将跟进社区的发展结合自身的业务需要,提升Hive型ETL流程的性能

点击阅读评论转发加关紸后续还会有许多知识点,与大家分享还可以私信我!

没有你想不到的,只有你做不到的

我要回帖

更多关于 转化成程序 的文章

 

随机推荐