Hive简介
Hive是一个基于hadoop的数据仓库,他可以将Parquet/ORC等结构化数据文件映射成表,并提供类SQL功能(HQL),输入的SQL语句会在处理后转化为MapReduce作业,最后提交到Yarn上运行。
特点:
- 简单容易上手,通过提供类似SQL的语言HQL,使得熟悉sql的人可以平滑迁移到hive上来,进行大数据分析。
- 灵活性高,可以自定义用户函数和存储格式
- 为超大的数据集设计的计算和存储能力,集群扩展容易;
- 统一的元数据管理,可与 presto/impala/sparksql 等共享数据;
- 执行延迟高,不适合做数据的实时处理,但适合做海量数据的离线处理。
- Hive的体系架构
1.command-line shell & thrift/jdbc
Hive命令入口分为command-line sheel和thrift/jdbc两种:
- command-line shell:通过 hive 命令行的的方式来操作数据;
- thrift/jdbc:通过 thrift 协议按照标准的 JDBC 的方式操作数据。
2.Metastore
在hive中,表名、表结构、字段名、字段类型、表的分隔符等统一被称为元数据,这些元数据都统一交给metastore管理,而metastore会将数据存储在RDBMS数据库中,如derby,MySQL等,默认情况是derby,但是由于derby只有一个实例,不便于metastore多实例场景,因此实际场景下derby通常会被mysql等数据库替代。
3.HQL编译过程:
在Hive执行一条HQL的时候,首先会解析传入数据,将注解,换行符等多余字段给删除,对于提供HQL脚本执行场景,会将HQL脚本解析出来,去除多余字段后,单行依次执行
3.1语法解析:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法树 AST Tree;
3.2语义解析:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
3.3生成逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
3.4优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变换,合并不必要的 ReduceSinkOperator,减少 shuffle 数据量;
3.5生成物理执行计划:遍历 OperatorTree,翻译为 MapReduce 任务;
3.6优化物理执行计划:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。
4.任务执行:
生成物理计划后,会将结果交给执行引擎执行,目前常用的有mapreduce,spark,tez三种,可通过hive.execution.engine参数进行指定,在HQL编译过程中,也会针对不同的执行引擎,做针对性的优化。
hive命令执行的整体流程见下图(以mapreduce为例):
- 常用hive优化器:
- 列裁剪和分区裁剪
最基本的操作。所谓列裁剪就是在查询时只读取需要的列,分区裁剪就是只读取需要的分区。以我们的日历记录表为例:
select uid,event_type,record_data
from calendar_record_log
where pt_date >= 20190201 and pt_date <= 20190224
and status = 0;
当列很多或者数据量很大时,如果select *或者不指定分区,全列扫描和全表扫描效率都很低。 Hive中与列裁剪优化相关的配置项是hive.optimize.cp,与分区裁剪优化相关的则是hive.optimize.pruner,默认都是true。在HiveSQL解析阶段对应的则是ColumnPruner逻辑优化器。
2.谓词下推
Predicate Pushdown(PPD):简而言之,就是在不影响结果的情况下,尽量将过滤条件提前执行。谓词下推后,过滤条件在map端执行,减少了map端的输出,降低了数据在集群上传输的量,节约了集群的资源,也提升了任务的性能。
举例来说:select a.*, b.* from a join b on (a.col1 = b.col1) where a.col1 > 20and b.col2 > 40大部分人可能认为应该通过将 a.col1 > 20 and b.col2 > 40 放到a表和b表里做子查询,减少数据量输入,这样做没有任何问题,但是上面这种写法,通过谓词下推优化器可以实现在读取a表和b表的同时将不符合条件的数据过滤掉。所以有时候不需要通过写子查询减少数据量输入,上面这种语法更加干净整洁。
3.Mapjoin
简单来说map join就是把小表加入到内存中,直接把相同的key进行join处理,减少shuffle过程,可以极大提高工作效率,适用于码表或者一些大表和小表join的情况。下面是执行流程图:
1)先启动Task A;Task A启动一个MapReduce的local task;通过该local task把small table data的数据读取进来;之后会生成一个HashTable Files;之后将该文件加载到分布式缓存中;
2)启动MapJoin Task,读大表的数据,每读一个就会和Distributed Cache中的数据关联一次,关联上后进行输出,整个阶段中没有reduce 和 shuffle。
4.数据倾斜
主要应用在发生倾斜的任务中。数据倾斜的情况相信大家也经常遇到,如mapreduce任务进度长时间等待在99%或者一些内存溢出的情况等。产生数据倾斜的原因有很多种,倾斜的原理是很多相同的key用同一个reduce处理,导致处理的任务过大,如共有200亿数据,有100亿为男生 100亿为女生,如图只有两个reduce处理数据:
上述情况发生了数据倾斜,两个reduce承受了所有的压力,不会有第三个reduce处理数据。
hive倾斜的优化器把一个shuffle拆分成两个shuffle过程:1、第一个shuffle过程:给key增加一个随机数,因此生成的hash值也不尽相同,相同的随机数+相同的原key生成的hash值依然一样,如此数据就会放到一起;
第二个shuffle过程:将前边的随机数去掉,重新聚合可以得到想要的结果。
通过分批处理解决数据倾斜问题的方案也是在spark等其他大数据计算引擎中通用且有效的方法。
除了上述的常用优化点之外,开源社区,华为云MRS都做了更多细粒度的优化,使得hive在保持稳定性的前提下有着较高的性能。
- 总结
Hive作为一款常用的数据仓库,他提供了非实时场景下稳定高效的大数据处理能力,设计上与各组件解耦:元数据存储,执行引擎,存储格式都可以支持多种组件。同时通过类SQL的HQL语言,降低的学习门槛,有利于其进一步推广。除此之外还有很多其他优势,这些优势帮助其在多种大数据组件中占据了一席之地。
作为补充材料,可以阅读华为云MRS服务hive组件的文档,进行更细粒度的学习:https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_0442.html
- 点赞
- 收藏
- 关注作者
评论(0)