Hive简介

xiatch 发表于 2022/05/31 19:23:07 2022/05/31
【摘要】 Hive是一个基于hadoop的数据仓库,他可以将Parquet/ORC等结构化数据文件映射成表,并提供类SQL功能(HQL),输入的SQL语句会在处理后转化为MapReduce作业,最后提交到Yarn上运行。特点:简单容易上手,通过提供类似SQL的语言HQL,使得熟悉sql的人可以平滑迁移到hive上来,进行大数据分析。灵活性高,可以自定义用户函数和存储格式为超大的数据集设计的计算和存储能...

Hive是一个基于hadoop的数据仓库,他可以将Parquet/ORC等结构化数据文件映射成表,并提供类SQL功能(HQL),输入的SQL语句会在处理后转化为MapReduce作业,最后提交到Yarn上运行。

特点:

  1. 简单容易上手,通过提供类似SQL的语言HQL,使得熟悉sql的人可以平滑迁移到hive上来,进行大数据分析。
  2. 灵活性高,可以自定义用户函数和存储格式
  3. 为超大的数据集设计的计算和存储能力,集群扩展容易;
  4. 统一的元数据管理,可与 prestoimpalasparksql 等共享数据;
  5. 执行延迟高,不适合做数据的实时处理,但适合做海量数据的离线处理。
  • Hive的体系架构


1.command-line shell & thrift/jdbc

  Hive命令入口分为command-line sheelthrift/jdbc两种:

  • command-line shell:通过 hive 命令行的的方式来操作数据;
  • thrift/jdbc:通过 thrift 协议按照标准的 JDBC 的方式操作数据。

   2.Metastore

   hive中,表名、表结构、字段名、字段类型、表的分隔符等统一被称为元数据,这些元数据都统一交给metastore管理,而metastore会将数据存储在RDBMS数据库中,如derbyMySQL等,默认情况是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.任务执行:

生成物理计划后,会将结果交给执行引擎执行,目前常用的有mapreducesparktez三种,可通过hive.execution.engine参数进行指定,在HQL编译过程中,也会针对不同的执行引擎,做针对性的优化。

hive命令执行的整体流程见下图(以mapreduce为例):

 

  • 常用hive优化器:
  1. 列裁剪和分区裁剪

最基本的操作。所谓列裁剪就是在查询时只读取需要的列,分区裁剪就是只读取需要的分区。以我们的日历记录表为例:

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 PushdownPPD):简而言之,就是在不影响结果的情况下,尽量将过滤条件提前执行。谓词下推后,过滤条件在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 ATask A启动一个MapReducelocal task;通过该local tasksmall 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作为一款常用的数据仓库,他提供了非实时场景下稳定高效的大数据处理能力,设计上与各组件解耦:元数据存储,执行引擎,存储格式都可以支持多种组件。同时通过类SQLHQL语言,降低的学习门槛,有利于其进一步推广。除此之外还有很多其他优势,这些优势帮助其在多种大数据组件中占据了一席之地。

   作为补充材料,可以阅读华为云MRS服务hive组件的文档,进行更细粒度的学习:https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_0442.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。