HIve 总结
穷且益坚,不坠青云之志。
一、Hive的特点以及和RDBMS的异同:
1、hive是一个数据仓库的工具,可以将结构化的数据完全映射成一张表,优点是学习成本低,底层是转化为MR的程序,它是不支持事务,不支持实时查询,具体和RDBMS区别如下:
(转载)
二、Hive中的数据倾斜:
1、数据倾斜的原因:(1)、key分布不均匀。(2)、业务数据本身的原因。(3)、建表考虑不周。(4)、某些SQL本身就有数据倾斜。
2、如何避免数据的倾斜:给key一个随机的值,打散key。
3、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中),最后完成最终的聚合操作。
4、SQL语句的调节:(1)、用好join key。(2)、map join让小表先进内存。(3)、大表join小表,把倾斜的数据分配到不同的reduce。(4)、count distinct 处理大量重复的数据。(5)、应该将条目少的表放在join操作符的左边,将最大的表放置在join的最右边,或则直接使用/* + streamtable(tableName)*/指出。
5、Hive关联两张表关联,使用MR怎么实现:①如果其中有一张表为小表,直接使用map端join的方式(map端加载小表)进行聚合。②如果两张都是大表,那么采用联合key,联合key的第一个组成部分是join on中的公共字段,第二部分是一个flag,0代表表A,1代表表B,由此让Reduce区分客户信息和订单信息;在Mapper中同时处理两张表的信息,将join on公共字段相同的数据划分到同一个分区中,进而传递到一个Reduce中,然后在Reduce中实现聚合。
三、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中的注意事项:
1、null在Hive中存储是默认是"\N"来存储的。
2、coalesce函数是返回参数中第一个非空值,如果都是空值那就返回null。
3、Hive中保存元数据的几种方式:(1)、内嵌式元存储服务器:该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库。(2)、本地元存储服务器:每个Hive客户端都会打开到数据库存储的连接并在该连接上请求SQL查询。(3)、远程元存储服务器:所有Hive客户端都会打开一个元数据服务器连接,该服务器依次查询元数据,元数据服务器和客户端之间使用Thrift协议通信。
4、Hive中的外部表和内部表的区别:①创建内部表的时候,会将数据移动到数据仓库指向的路径,创建外部表的时候,仅记录数据所在的位置,不对数据做任何的该表。②删除外部表的时候,只是删除元数据,不会删除数据,删除内部表的时候,元数据和数据都会被删除,相对来说,外部表更加安全和灵活,易于数据的共享。
5、Hive中的权限控制:见博客:https://www.cnblogs.com/zimo-jing/p/9079538.html
五、Hive中HiveSQL转换成MR的过程:
六、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函数:UDF、UDAF、UDTF:
1、UDF:单行进入,多行输出。
2、UDAF:多行进入,单行输出。
3、UDTF:多行进入,多行输出。
九、Hive的桶表:
1、桶表是对于字段进行hash取值,然后再与桶的数据进行模运算。把数据放到对应的文件中,物理上,一个桶就是一个表的目录中的文件,一个作业产生的桶和reduce任务个数相同。
2、桶表是专门用来进行抽象查询的,是很有专业性的。
十、Hive中的优化措施:
1、fetch抓取:修改配置文件hive.fetch.task.conversion为more,修改好全局查找和字段查找以及limit都不会触发MR任务。
2、本地模式:大多数的Hadoop Job要求Hadoop提供完整的可扩展性来触发大数据集,不过有时候hive的输入数据量非常的小,这样的情况下可能触发任务的事件比执行的事件还长,我们就可以通过本地模式把小量的数据放到本地上面计算。
3、大小表的join:将key相对于分散,数据量小的表放到join的左边。新版的hive对于这个方面的优化已经改进了。
4、大表join小表:①把空key过滤。②空key的转化。
5、MapJoin:如果不指定MapJoin和满足MapJoin的条件,那么Hive解析器会将join操作转化成Common join,即在Reduce阶段完成join,容易发生数据的倾斜,可以用MapJoin把小表加载到内存中去。(1)、设置MapJoin:set hive.auto.convert.join = true。(2)、大表小标的阈值设置,默认25M一下认为是小表:set hive.mapjoin.samlltable.filesize= 25000000。(3)、工作流程:首先是Task A,它是一个Local Task(在客户端本地执行的Task),负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中。接下来是Task B,该任务是一个没有Reduce的MR,启动MapTasks扫描大表a,在Map阶段,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果。由于MapJoin没有Reduce,所以由Map直接输出结果文件,有多少个Map Task,就有多少个结果文件。
6、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。
7、count dinstinc去重:大的数据集先用count distinct查找重复的字段,然后用group by再去重。
8、笛卡儿积:尽量避免笛卡儿积,join的时候不加on,或则无效的on条件。
9、行列过滤:列处理:只拿自己需要的列,如果有,尽量使用分区过滤。行处理:在分区裁剪的时候,当使用外关联的时候,先完全关联再过滤。
10、动态分区调整:(1)、开启动态分区:hive.exec.dynamic.partition=true。(2)、设置为非严格模式:hive.exec.dynamic.partiton.mode = nostrict。(3)、实操:创建分区表、加载数据到分区表中、创建目标分区、设置动态分区、查看目标分区表的分区情况。
11、分桶:见前面。
12、分区:见前面。
13、小文件进行合并:在map执行之前合并小文件,减少map的数量,设置 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。
14、调整map的数量和reduce的数量。
15、并行执行:在Hive中可能有很多个阶段,不一定是一个阶段,这些阶段并非相互依赖的。然后这些阶段可以并行完成,设置并行:set hive.exec.parallel = true。
16、严格模式:(1)、设置严格模式:hive.mapred.mode = strict。(2)、对于分区表,除非用where语句中含有分区字过滤条件,其他不允许查询。(3)、对于使用order by 函数,使用limit来限制。(4)、限制笛卡尔积的使用。
17、JVM的重用,缺点是task槽会被占用,一直要等到任务完成才会释放。
18、推测执行:有的任务可能执行到百分之五十,其他任务就都执行完成了,Hadoop采用了推测执行任务,启动一个备份任务,选用最快执行完成的结果作为最终结果。
19、压缩:见前面。
20、查看执行计划,用explain来查看。
更多文章见: