Hive 面试总结

2020-07-01 00:00:00 数据 分区 分区表 倾斜 聚合

一、Hive的和RDMBS的区别:

二、Hive中数据倾斜问题:

1、数据倾斜的原因:(1)、key分布不均匀。(2)、业务数据本身的原因。(3)、建表考虑不周。(4)、某些SQL本身就有数据倾斜。

2、如何避免数据的倾斜:

(1)给key一个随机的值,打散key。

(2)Hive中的参数调节:①hive.map.aggr = true。②hive.groupby.skewindata = true。作用:有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),后完成终的聚合操作。

(3)SQL语句的调节:1、选用join key分布均匀的表作为驱动表。2、大小表join的时候,让维度较小的表先进内存。3、大表join的时候,把空值的key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上。4、count distinct大量相同特殊值。

三、Hive中sort by、order by、cluster by、distribute by的区别:

1、sort by:不是全局排序,其在数据进入reducer前完成排序。

2、order by:会对输入做全局排序,因此只有一个reducer,如果有多个reducer无法保证全局的排序。计算规模较大,时间可能会很长。

3、cluster by:除了具有distribute by的功能,还具有了sort by的功能。

4、distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。

四、Hive中HiveSQL转换成MR的过程:

五、Hive中元数据保存方式:

1、内嵌式元存储服务器:该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库

2、本地元存储服务器:每个Hive客户端都会打开到数据库存储的连接并在该连接上请求SQL查询。

3、远程元存储服务器:所有Hive客户端都会打开一个元数据服务器连接,该服务器依次查询元数据,元数据服务器和客户端之间使用Thrift协议通信。

4、Hive中的外部表和内部表的区别:①创建内部表的时候,会将数据移动到数据仓库指向的路径,创建外部表的时候,仅记录数据所在的位置,不对数据做任何的该表。②删除外部表的时候,只是删除元数据,不会删除数据,删除内部表的时候,元数据和数据都会被删除,相对来说,外部表更加安全和灵活,易于数据的共享。

六、Hive中的数据类型:

1、简单数据类型:

(1)、整型,如:tinyint,smallint,int,bigint。

(2)、字符串类型,如:string。

(3)、时间戳类型。

(4)、日期型。

(5)、浮点型,如:float,double。

2、复杂数据类型:

(1)、映射,关键字:map。

(2)、结构体,关键字:struct。

(3)、数组,关键字:array。

3、null类型:在hive中底层是用'\N'来存储的,可以通过alter table tableName set serdeproperties('serialization.null.format'='a')来设置。

七、Hive与底层数据库的交互:

八、Hive中的文件存储格式及文件的压缩格式:

1、文件存储格式有:TextFile、SequenceFile、RCFile、ORCFile。

2、TextFile:默认格式,存储方式为行存储,数据不做压缩,磁盘开销大,数据解析开销大,可以结合GZIP和BZIP使用,但是使用这种方式,压缩的文件不支持split,Hive不对数据进行切分,从而无法对数据进行并行操作。

3、SequenceFile:这是由Hadoop API提供的一种二进制文件支持,其具有使用方便,可分割,可压缩的特点,它支持三种压缩格式:None,Record,Block。Record压缩率低,一般使用Block。

4、RCFile:按行分块,每块按列存储。RCFile不支持任意方式的数据写入,仅提供了一种追加接口。

5、ORCFile:按行分块,每块按列存储,压缩快,快速列存取。

九、Hive中的三种自定义函数:

1、UDF:单行进入,单行输出。

2、UDAF:多行进入,单行输出。

3、UDTF:多行进入,多行输出。

十、Hive的优化:

1、fetch抓取:修改配置文件hive.fetch.task.conversion为more,修改好全局查找和字段查找以及limit都不会触发MR任务。

2、本地模式:大多数的Hadoop Job要求Hadoop提供完整的可扩展性来触发大数据集,不过有时候hive的输入数据量非常的小,这样的情况下可能触发任务的事件比执行的事件还长,我们就可以通过本地模式把小量的数据放到本地上面计算。

3、Group by:默认情况下,map阶段同一key的数据会发给一个reduce,当一个key数据过大就会倾斜,并不是所有的聚合操作都需要reduce端完成,很多聚合操作都可以现在map端进行部分聚合,后在reduce端得出终结果。(1)、开启在map端聚合:hive.map.aggr = true。(2)、在map端进行聚合操作的条目数:hive.groupby.mapaggr.checkinterval = 100000。(3)、有数据倾斜的时候进行负载均衡:hive.groupby.skewindata = true。

4、count dinstinc去重:大的数据集先用count distinct查找重复的字段,然后用group by再去重。

5、行列过滤:列处理:只拿自己需要的列,如果有,尽量使用分区过滤。行处理:在分区裁剪的时候,当使用外关联的时候,先完全关联再过滤。

6、动态分区调整:(1)、开启动态分区:hive.exec.dynamic.partition=true。(2)、设置为非严格模式:hive.exec.dynamic.partiton.mode = nostrict。(3)、实操:创建分区表、加载数据到分区表中、创建目标分区、设置动态分区、查看目标分区表的分区情况。

7、小文件进行合并:在map执行之前合并小文件,减少map的数量,设置 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。

8、调整map的数量和reduce的数量。

9、并行执行:在Hive中可能有很多个阶段,不一定是一个阶段,这些阶段并非相互依赖的。然后这些阶段可以并行完成,设置并行:set hive.exec.parallel = true。

10、JVM的重用,缺点是task槽会被占用,一直要等到任务完成才会释放。

十一、Hive的思维导图:

相关文章