Hive组件以及执行过程

对Hive的基本组成进行了总结:

1、组件:

元存储(Metastore )-存储“系统目录以及关于表、列、分区等的元数据”的组件。
驱动(Driver )- 控制 HiveQL 生命周期的组件,当 HiveQL 查询穿过 Hive时。该驱动管理着会话句柄以及任何会话的统计。
查询编译器(Query Compiler) - 是一个组件,将HiveQL编译成有向无环图(directed acyclic graph, DAG)形式的map/reduce任务。
执行引擎 Execution Engine - 是一个组件,依相依性顺序(dependency order)执行由编译器产生的任务。
Hive 服务器 HiveServer - 一个提供“健壮的接口(thrift interface )、JDBC/ODBC 服务器以及提供一种整合 Hive 和其它应用的”组件。
客户端组件 -类似命令行接口CLI(Command Line Interface), web UI 以及JDBC/ODBC驱动。包含了正反序列化(SerDe)以及对象观察器(ObjectInspector)接口的可扩展接口,类似于前述用户定义函数 UDF (User Defined Function)以及用户定义聚合函数UDAF(User Defined AggregateFunction)接口,允许用户定义自己的列函数。

2、执行的过程:

HiveQL通过CLI/web UI或者thrift 、 odbc 或 jdbc接口的外部接口提交,经过complier编译器,运用Metastore中的云数据进行类型检测和语法分析,生成一个逻辑方案(logical plan),然后通过简单的优化处理,产生一个以有向无环图DAG数据结构形式展现的map-reduce任务

3、元存储(Metastore)

存储列所有关于表、表的分区、模式、列及其类型、表地址等的表的元数据,可以通过thrift接口查询得到,由于需要快速的提供到编译器中,所以使用RDBMS

4、查询编译器(query complier)

用云存储中的元数据来生成执行计划,步骤如下:
1).解析(parse)-anlr解析其生成语法树AST(hibernate也是这个):将HQL转化为抽象语法树AST
2).类型检查和语法分析(type checking and semantic analysis):将抽象语法树转换此查询块(query block tree),并将查询块转换成逻辑查询计划(logic plan Generator);
3).优化(optimization):重写查询计划(logical optimizer)-->将逻辑查询计划转成物理计划(physical plan generator)-->选择最佳的join策略(physical optimizer)

parse   sa    lpg       lo        ppg       po
hql------->AST------>QB----->OP TREE------->OP TREE------->task tree------->task tree

首先进行hql语句解析,构造一颗AST树,从AST树中得到QueryBlock,再将QB转为对应的操作符,生成逻辑查询计划,对逻辑查询计划进行优化(谓词下推),生成物理查询计划,对物理查询计划进行优化(MapJoinResolver/SkewJoinResolver/CommonJoinResolver),得到最后的执行计划。

MapJoinResolver:将小表的MR结果放入HashTableFiles-->DistributedCache,大表从分布式缓存中取得数据进行join;当hash数据较大时,分布式缓存查询效率降低,同时大表的Map都>在等待hash files;所以对其进行列优化处理小表的结果放到DC中进行压缩和更新,大表遍历时从DC中取出tar包>,然后解压读取本地的hash files

Hive完成列以下转换,作为优化阶段的一部分:
1).列剪辑(column pruning):查询处理中唯一需要的列确实从行中投射出去
2).谓语下推(Predicate pushdown):将只于一张表有关的过滤操作下推至TableScanOperator之后,
3).分区剪辑(Partition pruning):过滤掉分区上不符合条件的字段
4).Map 端的连接(Map side joins):当join的表很小时,在map段先复制它然后再进行join,格式如下:
 SELECT /*+ MAPJOIN(t2) */ t1.c1, t2.c1 FROM t1 JOIN t2 ON(t1.c2 = t2.c2);
 由hive.mapjoin.size.key以及hive.mapjoin.cache.numrows控制“任何时间保存在内存中的”表中行的数量,以及提供给系统联合键的大小
5).连接再排序(Join reordering):把较小的表保存在内存中,较大的表进行遍历操作,保证系统内存不溢出

5、MapJoin的进一步优化

1).数据再分区以把控GROUPBY形成的非对称(skews):用两个MapReduce来做,第一个阶段将数据随机分发(或者按DISTINCT列分发在DISTINCT聚合的情况下)至reducers,并且计算聚合值;然后这些聚合结果按照GROUP BY 列分发给在第二个Reducer;

     set hive.groupby.skewindata= true ;
    SELECT t1.c1, sum(t1.c2)
    FROM t1
    GROUP BY t1.c1;

2).mappers中的基于哈希的局部聚合:相当于combiner,在map端内存中进行聚合,然后发送给reducers,参数hive.map.aggr.hash.percentmemory说明了mapper 内存中可用于把控哈希表那部分的数量。如0.5能确保哈希表大小一旦超过用于mapper的最大内存的一半,存储在那儿的部分聚合就被发送到reducers了。hive.map.aggr.hash.min.reduction参数同样也用来控制用于mappers的内存数量

6、执行引擎(execution engine):

按照任务的依赖关系序列来执行

7.其它优化:

1).Left Semi Join实现in/exists子查询:
SELECT A.* FROM A LEFT SEMI JOIN B ON(A.KEY = B.KEY AND B.KEY > 100);
等同于SELECT A.* FROM A WHERE A.KEY IN(SELECT B.KEY FORM B WHERE B.KEY > 100);
作用:map端用group by减少流入reduce端的数据量

2).Bucket Map Join:
set hive.optimize.bucketmapjoin = true;
和Map join一起工作;
所有join的表都做列分桶,同时大表桶的数量是小表桶的整数倍;
做bucket的列必须是join的列;

SELECT /*+MAPJOIN(a,c)*/ a.*, b.*, c.*
a join b on a.key = b.key
join c on a.key=c.key;
在现实的生产环境中,会有成百上千个buckets;

3).Skew join:
join时数据倾斜,造成Reduce端OOM
set hive.optimize.skewjoin = true;
set hive.skewjoin.key = 阀值;

当JOIN得到的map超过阀值时,将内存中的a-k1/b-k1数据分别存入hdfs中,然后遍历完后再对hdfs上的两块数据做Map Join,和其它key一起组成最后结果

参考链接:http://blog.csdn.net/lifuxiangcaohui/article/details/40262021

时间: 2024-08-15 08:01:58

Hive组件以及执行过程的相关文章

hive组件和执行过程

转自http://blog.csdn.net/lifuxiangcaohui/article/details/40262021 对Hive的基本组成进行了总结: 1.组件: 元存储(Metastore )-存储“系统目录以及关于表.列.分区等的元数据”的组件.驱动(Driver )- 控制 HiveQL 生命周期的组件,当 HiveQL 查询穿过 Hive时.该驱动管理着会话句柄以及任何会话的统计.查询编译器(Query Compiler) - 是一个组件,将HiveQL编译成有向无环图(dir

Hive学习之路 (二十)Hive 执行过程实例分析

一.Hive 执行过程概述 1.概述 (1) Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等 (2)操作符 Operator 是 Hive 的最小处理单元 (3)每个操作符代表一个 HDFS 操作或者 MapReduce 作业 (4)Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分 布式两种模式 2.Hive 操作符列表 3.Hive 编译器的

springmvc组件组成以及springmvc的执行过程

springmvc三大组件 处理器映射器:用户请求路径到Controller方法的映射 处理器适配器:根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同区寻找不同的处理器适配器 视图解析器:根据handler返回的view地址文件类型(jsp/pdf….)去寻找相应的视图解析器来进行解析 springmvc的执行过程 执行流程: 1. 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获(捕获) 2.

Hive SQL的编译过程

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用.美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析.Hive的稳定性和性能对我们的数据分析非常关键. 在几次升级Hive的过程中,我们遇到了一些大大小小的问题.通过向社区的咨询和自己的努力,在解决这些问题的同时我们对Hive将SQL编译为MapReduce的过程有了比较深入的理解.对这一过程的理解不仅帮助我们解决了一些Hive的bug,也有利于我们优化Hive SQL

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增记录SQL执行过程

有时我们需要记录整个系统运行的SQL以作分析,特别是在上线前这对我们做内部测试也非常有帮助,当然记录SQL的方法有很多,也可以使用三方的组件.3.2版本我们在框架底层新增了记录框架运行的所有SQl过程保存到用户指定的地方以便分析查看,只需要在配置文件把配置项"LogSQL"设置为True即可.框架会自动记录各常用数据库如:Oracle.SqlServer.MySQL等的操作情况. 一.Web记录Sql执行情况 1.在我们的Web项目中要记录SQL可以在Web的配置文件中设置LogSql

打开较大存储量的.sql文件时,出现SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问

1. “消息 15281,级别 16,状态 1,过程 xp_cmdshell,第 1 行SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭.系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'.有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器". ” 解决方法: sqlserver2

Android Activity组件的启动过程

0.总图 1.总图中的第一步,Laucher主线程向ActivityManagerService进程发出START_ACTIVITY_TRANSACTION 如图:第一步 ~/Android/frameworks/base/core/java/android/app ----ActivityManagerNative.java class ActivityManagerProxy implements IActivityManager { public int startActivity(IAp

Bigbluebutton服务执行过程及相关配置文件

BigBlueButton服务列表 BigBlueButton由许多开源的服务组成,看似很麻烦,实际上拆分开每一个服务就很简单了,组件化平台化.究竟BBB都用到了哪些开源服务?我们来列举一下,名称均带有对应官网链接.1.Ubuntu乌班图操作系统,友好的用户交互界面:2.Flex SDK,高效构建Web应用程序,基于所有浏览器的开源框架,AS3编写客户端软件的SDK:3.Ghostscript文档转换:4.Grails开源Web框架:5.ActiveMQ(官网有介绍,但未发现使用位置):6.Im

Java中JIN机制及System.loadLibrary() 的执行过程

Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平台上的JNI机制使用包括Java代码中调用Native模块以及Native代码中调用Java模块. http://www.ophonesdn.com/article/show/263(misybing:很遗憾该站已经挂掉) 众所周知,OPhone平台上的应用开发主要基于Java语言,但平台完全支持且