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大量相同特殊值。
二、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中。
三、元数据保存方式
1、内嵌式元存储服务器:该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库
2、本地元存储服务器:每个Hive客户端都会打开到数据库存储的连接并在该连接上请求SQL查询。
3、远程元存储服务器:所有Hive客户端都会打开一个元数据服务器连接,该服务器依次查询元数据,元数据服务器和客户端之间使用Thrift协议通信。
4、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的和RDMBS的区别