hive 考点总结

Hive是一个基于Hadoop的数据仓库工具,提供了类SQL查询接口用于大数据分析。它将SQL语句转化为MapReduce任务,支持表的内部和外部创建,以及分区和分桶。Hive的优点在于简化开发,但效率较低,适合离线分析。数据倾斜是常见问题,可通过优化SQL、参数调整和处理策略来解决。Hive的优化包括选择合适的join策略、调整mapper和reducer数量以及处理倾斜的key。
摘要由CSDN通过智能技术生成

HIVE 是基于Hadoop的数据仓库,
能够把结构化的数据映射成一张表 并提供类sql查询
将sql语句转化为MapReduce程序
hive数据存储在hdfs中 分析数据的底层实现是在MapReduce上 执行程序运行在yarn上面

hive 优点 
1操作接口采用类sql语法提供快速开发的能力
2避免了去写mapreduce程序节省了开发人员的学习成本
3hive 的执行延迟比较高 所以hive常用于数据分析 和实时性要求不高的场景
4hive 的执行延迟度比较高,适合于处理大数据 ,对小数据没有优势。
5hive 支持用户自定义函数 用户可以根据自己的需求来实现自己的函数。

hive的缺点  hql表达能力有限
1迭代式算法无法表达
2数据挖掘方面不擅长
hive的效率比较低
1hive自动生成的MapReduce作业通常情况下不够智能化
2 hive调优比较困难粒度较粗。

Hive QL语句是怎么执行的?

整个过程的执行步骤如下:

 (1) 解释器完成词法、语法和语义的分析以及中间代码生成,最终转换成抽象语法树;

 (2) 编译器将语法树编译为逻辑执行计划;

 (3) 逻辑层优化器对逻辑执行计划进行优化,由于Hive最终生成的MapReduce任务中,Map阶段和Reduce阶段均由OperatorTree组成,所以大部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MapReduce Job和减少shuffle数据量的目的;

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

 (5) 执行器调用底层的运行框架执行最终的物理执行计划。
内部表和外部表的区别吗?

     创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表用exteral,仅记录数据所在的路径, 不对数据的位置做任何改变。
   内部表数据由Hive自身管理,外部表数据由HDFS管理;删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
Hive的构成包括哪些部分?

用户接口层:常用的三个分别是CLI,JDBC/ODBC 和 WEBUI。其中最常用的是CLI,CLI启动的时候,会同时启动一个Hive副本。JDBC/ODBC是Hive的客户端,用户通过客户端连接至Hive Server。在启动客户端模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。WEBUI是通过浏览器访问Hive。
元数据存储:Hive将元数据存储在RDBMS中,有三种模式可以连接到数据库,分别是内嵌式元存储服务器、本地元存储服务器、远程元存储服务器。
Driver(Compiler/Optimizer/Executor)

Driver完成HQL查询语句的词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS上,并由MapReduce调用执行。

 分区表和分桶表的区别?

分区表,Hive 数据表可以根据某些字段进行分区操作,细化数据管理,让部分查询更快,不同分区对应不同的目录;

分桶表:表和分区也可以进一步被划分为桶,分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,不同的桶对应不同的文件。
Hive的作用有哪些

  可以将结构化的数据文件映射成一张表,并提供类SQL查询功能,方便非java开发人员对hdfs上的数据做 MapReduce 操作;
可以对数据提取转化加载(ETL)

构建数据仓

5)Hive的使用场景

 即席查询:利用CLI或者类似Hue之类的工具,可以对Hive中的数据做即席查询,如果底层的引擎使用的是MapReduce耗时会很久,可以替换成Tez或者Spark;
离线的数据分析:通过执行定时调度或者脚本去执行HQL语句,并将结果保存;
构建数仓时用于组织管理数据库和表。
数据倾斜
    数据倾斜不仅在Hive面试中会被问到,其他只要涉及到大规模程序开发的组件都会问到数据倾斜方面的问题,因为这是在实际工作中经常会出现的问题,如何去避免和解决出现的数据倾斜问题是衡量你代码水平高低的尺子。

1)什么是数据倾斜?

    数据倾斜就是数据的分布不平衡,某些地方特别多,某些地方又特别少,导致在处理数据的时候,有些很快就处理完了,而有些又迟迟未能处理完,导致整体任务最终迟迟无法完成,这种现象就是数据倾斜。

2)你知道发生数据倾斜的原因吗?

发生数据倾斜的原因有很多,大致可以归为:

1)key分布不均匀;

2)数据本身的特性,原本按照日期进行分区,如果在特定日期数据量剧增,就有可能造成倾斜;

3)建表时考虑不周,分区设置不合理或者过少;

4)某些 HQL 语句本身就容易产生数据倾斜,如 join。

、HIVE优化
1)谈谈如何对join操作进行优化?

join优化是个复杂的问题,可以从以下几点进行优化:

1)小表前置

大小表在join的时候,应该将小表放在前面,Hive在解析带join的SQL语句时,会默认将最后一个表作为大表,将前面的表作为小表并试图将它们读进内存。如果表顺序写反,大表在前面,可能会引发OOM。

2)key值相同

多表join的时候尽量使用相同的key来关联,这样会将会将多个join合并为一个MR job来处理。

3)利用map join特性

map join特别适合大小表join的情况。Hive会将大表和小表在map端直接完成join过程,消灭reduce,效率很高。Hive 0.8版本之前,需要加上map join的暗示,以显式启用map join特性,具体做法是在select语句后面增加/*+mapjoin(需要广播的较小表)*/。

map join的配置项是hive.auto.convert.join,默认值true;还可以控制map join启用的条件,hive.mapjoin.smalltable.filesize,当较小表大小小于该值就会启用map join,默认值25MB。

2)对于空值或者无意义的值引发的数据倾斜,该怎么处理呢?

   这在写程序的时候要考虑清楚,这些异常值的过滤会不会影响计算结果,如果影响那就不能直接过滤掉,可以将这些异常的key用随机方式打散,例如将用户ID为null的记录随机改为负值。

3)如何调整mapper数?

mapper数量与输入文件的split数息息相关,可以通过设置相关参数来调整mapper数。

1)可以直接通过参数mapred.map.tasks(默认值2)来设定mapper数的期望值,但它不一定是最终mapper数;

2)输入文件的总大小为total_input_size。HDFS中,一个块的大小由参数dfs.block.size指定,默认值64MB或128MB。所以得出来的默认mapper数就是:

default_mapper_num = total_input_size / dfs.block.size,但是它也不一定是最终的mapper数;

3)设置参数mapred.min.split.size(默认值1B)和mapred.max.split.size(默认值64MB)分别用来指定split的最小和最大值。那么split大小和split数计算规则是:

split_size = MAX(mapred.min.split.size, MIN(mapred.max.split.size, dfs.block.size));

split_num = total_input_size / split_size。

4)最终得出mapper数:

mapper_num = MIN(split_num, MAX(default_mapper_num, mapred.map.tasks))。

其中可变的参数有:mapred.map.tasks、dfs.block.size(不会为了一个程序去修改,但是也算是一个可变参数)、mapred.min.split.size、mapred.max.split.size,通过调整他们来实现,mapper数的变化。

4)如何调整reducer数?

利用参数mapred.reduce.tasks可以直接设定reducer数量,不像mapper一样是期望值。如果不设这个参数的话,Hive就会自行推测,逻辑如下:

1)参数hive.exec.reducers.bytes.per.reducer用来设定每个reducer能够处理的最大数据量。

2)参数hive.exec.reducers.max用来设定每个job的最大reducer数量。

3)reducer数:

reducer_num = MIN(total_input_size / reducers.bytes.per.reducer, reducers.max)。

reducer数量决定了输出文件的数量。如果reducer数太多,会产生大量小文件,对HDFS造成压力。如果reducer数太少,每个reducer要处理很多数据,容易拖慢执行时间也有可能造成OOM。

5)什么时候又需要合并文件?如何合并小文件?

当有很多小文件的时候没需要合并小文件,可以在输入阶段合并,也可以在输出阶段合并。

1)输入阶段合并

要想文件自动合并,需要更改Hive的输入文件格式,通过参数hive.input.format来更改,默认值是org.apache.hadoop.hive.ql.io.HiveInputFormat,需要改成org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。还需要设置mapred.min.split.size.per.node和mapred.min.split.size.per.rack这两个参数,他们的含义是单节点和单机架上的最小split大小。设置完后,如果发现有split大小小于这两个值(默认都是100MB),则会进行合并。

2)输出阶段合并

设置hive.merge.mapfiles为true可以将map-only任务的输出合并;

设置hive.merge.mapredfiles为true可以将map-reduce任务的输出合并。另外,设置hive.merge.size.smallfiles.avgsize可以指定所有输出文件大小的均值阈值,一旦低于这个阈值,就会启动一个任务来进行合并


cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的
Sed
sed是一种流编辑器,
awk
一个强大的文本分析工具,
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

Hive排序
全局排序(Order by)
Order By:全局排序,一个Reducer
ASC: 升序(默认)
DESC: 降序
内部排序(Sort by)
每个 Reducer 内部进行排序,对全局结果集来说不是排序。
分区排序 (Distribute By)
类似 MR 中 partition ,进行分区,结合 sort by 使用。
注意: Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by的效果。
Cluster by
当distribute by 和sorts by 字段相同时,可以使用cluster by 方式。
cluster by 除了具有distribute by 的功能外还兼具sort by 的功能。但是排序只能是升序排序,不能指定排序规则为ASC 或者DESC。
以下两种写法等价:
hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;
注意:按照部门编号分区,不一定就是固定死的数值,可以是20 号和30 号部门分到一个分区里面去。


因为truncate table在功能上与不带WHERE子句的DELETE语句相同:
二者均删除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。
DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

delete
delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。
delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。
drop
drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
truncate
truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reuse storage,。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。
对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句。
4、truncatetable不能用于参与了索引视图的表。
适用场景
TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。
truncate与不带where的delete:只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
在没有备份情况下,谨慎使用drop与truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
一般而言,执行速度:drop > truncate > delete
Hive中的操作(drop、truncate)
hive是数据仓库,存储格式是文本,不支持行级别的更新删除和插入。
所以在hive中,只有drop table、truncate操作,没有delete操作
hive 语句执行顺序
from … where … select … group by … having … order by … limit …

、key分布不均衡

二、业务问题后者业务数据本身的问题,某些数据比较集中

三、建表的时候考虑不周

四、某些sql语句本身就有数据倾斜,例如:

(1)大表join小表:其实小表的key集中,分发到某一个或者几个reduce上的数据远远高于平均值

(2)大表join大表:空值或无意义值:如果缺失的项很多,在做join时这些空值就会非常集中,拖累进度。

(3)group by: group by的时候维度过小,某值的数量过多,处理某值的reduce非常耗时间。

(4)Count distinct:某特殊值过多,处理此特殊值的reduce耗时。

3、Hive数据倾斜解决
【参数调节】 hive.map.aggr = true

Map端部分聚合。

有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob中,Map的输出结果集合会随机分不到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同于Group By Key 有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照Group By Key分不到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

【SQL调整】

1)如何join:关于驱动表的选取,选用join key分布最均匀的表作为驱动表,做好列裁剪和filter操作,以达到两表做join的时候,数据量相对变小的效果。

2)大小表join的时候:使用map join 让小的维度表先进内存,在map端完成reduce。效率很高。

3)大表join大表的时候:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后不影响最终的结果。

4)count distinct 大量相同特殊值,将这些值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1即可。如果还有其他的计算,需要进行group by,可以先将那些值为空的记录单独处理,再和其他计算结果进行 union。

5)group by 维度过小的时候:采用sum() group by 的方法来替换count(distinct)完成计算。

6)单独处理倾斜key:一般来讲倾斜的key都很少,我们可以将它们抽样出来,对应的行单独存入临时表中,然后打上随机数前缀,最后再进行聚合。或者是先对key做一层hash,先将数据随机打散让它的并行度变大,再汇集。其实办法一样。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值