Hive原理及查询优化

Hive原本只支持数据的查询和加载,后面也支持了插入,更新和删除以及流式的api,hive拥有最全的语法
和最稳定的执行,与其他spark sql或者presto相比,更适用于稳定的作业执行,后者更倾向于交互式的场景。
Hadoop由HDFS和Yarn组成,HDFS用于执行存储,Yarn用于资源调度和计算,MR是跑在Yarn上的一种计算作业。
Hive的主要任务是把一个sql转化成一个分布式的作业(如MR,Spark,Tez,原理差不多)
这里写图片描述
Hive是最上层,即客户端或者作业提交层,
MR/Yarn是中间层,也就是计算层
HDFS是底层,也就是存储层
Hive主要有QL,MetaStore和Serde三大核心组件构成,QL就是编译器,也就是Hive中最核心的部分,Serde就是Serializer和Deserializer的缩写。用于序列化和反序列化数据,即读写数据。MetaStore对外暴露,用于元数据的修改,比如表的增删改查,分区的增删改查,表的属性的修改,分区的属性的修改等。

Hive的数据存储在HDFS上,基本存储单位是表或者分区,Hive内部把表或者分区称作SD,即Srorage Descriptor。一个SD通常是一个HDFS路径或者其他文件系统的路径。SD的元数据信息存储在Hive MetaStore中。

Hive的核心是Driver,Driver的核心是SemanticAnalyzer,Hive实质是一个Sql到hadoop作业的编译器

编译流程:
这里写图片描述
Driver输入一个sql,然后经过Parser由Antlr变成了AST,也就是Anltr根据语法文件将sql变成了AST。
AST进入SemanticAnalyzer变成QB(queryBlock)。一个最简的查询快。一个子句会生成一个QB,生成QB是一个递归的过程,QB经过GenLogicalPlan过程,变成了一个Operator图,就是有向无环图。
OP DAG经过逻辑优化器。变成了优化后的有向无环图。包括:谓词下推,分区剪裁,关联排序等等
经过了优化,Hive的通常做法是遇到需要分发的地方切上一刀,生成一道MR。例如,group by一刀,join一刀,然后那个有向无环图就被切成了很多个子图,每个子图构成了一个节点,这些节点有连城了一个执行价计划图,也就是task Tree。Task Tree还可以有一些优化,比如基于输入选择执行路径,增加备份作业等,这个就是有Physical Optimizer来完成。

Hive最重要的部分是Group By和Join
Group
对于Impala或者Spark,key在内存中,对于Hive,key在硬盘中。所以hive是稳定的但是速度慢的。
Group By的优化通常有Map断数据聚合和倾斜数据分发两种方式。
Map端部分聚合的配置开关是hive.map.aggr = true。原理是map端发到reduce之前先聚合一下,这样可以减少reduce接收到的数据量,优化聚合速度。
针对倾斜的key做两道作业的聚合。使用hive.groupby.skewindata = true选项,通过两道MR作业,生成的查询计划会有两个MR job,一个job的输出结果集合会随机分布到reduce中,每个reduce做部分聚合操作并输出结果第二个job再根据处理的数据结果按照group ByKey分布到reduce中,最后完成最终的聚合操作。
第一道job:map随机分发,按gby key部分聚合,达到负载均衡的目的
第二道job:第一道作业结果Map倾斜的key分发,按bgy key进行最终聚合。
无论是使用哪种方式,都是通过部分聚合来减少数据量的,所以能不能达到效果,通常与UDAF(聚合函数)有关。也就是对代数聚合有效,对整体聚合函数无效。
代数聚合:部分结果可以汇总出整体结果的函数如 count,sum
整体聚合:就是无法由部分结果汇总出整体结果的函数,如avg,mean

Join
这里写图片描述
这里写图片描述
reduce的时候会把pv表读到内存,然后逐条与硬盘上的user表做join,所以,在写hive Join的时候,应该尽量把小表(分布均匀的表)写在左边,大表(倾斜表)写在后边,hive只支持等值join,不知道非等值的join。
还有一种执行非常快的Join叫Map Join
有手动的Map Join和auto Map Join,可以手动的指定哪个是小表
新版的Hive中,auto Mapjoin是默认开启的,如果没有开启就使用一个开关,set.hive.auto.convert.join = true开启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值