Hive数据倾斜优化和分区

二、Hive数据倾斜问题优化

1.现象

当Hive放生数据倾斜的时候,我们在使用HQL运行mr的时候可以发现,mapreduce卡在99%

2.当Hive发生数据倾斜的时候我应该怎么办呢?

第一种方案,数据倾斜五分就是key的数据量非常不均匀,我们可以开启map聚合的参数(hive.map.aggr=ture),开启之后会把数据现在map端进行聚合,当reduce端聚合的时候就只需要聚合map端聚合完的参数就可以了

第二种是当大表和小表进行JOIN的时候,也可能导致数据倾斜。为了解决这个问题,考虑使用到mapjoin,mapjoin会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和在内存中表的数据进行匹配,由于mapjion是在map端进行了join操作,省去了reduce的运行,所以效率会快很多

第三种是当大表和大表join的时候发生数据倾斜,具体操作室建立一个numbers表,其值只有一列int 行,比如从1到10(具体值可根据倾斜程度确定),然后放大B表10倍,再取模join

 

三、分区

1.Hive静态分区

就是在不开启动态分区的条件下都是静态分区,使用方式就是HQL

 

  1. Hive动态分区

1)参数设置

· 开启动态分区

 

启用动态分区功能    hive> set hive.exec.dynamic.partition=true;

注:hive2.x该参数默认为true,1.x为false

· 模式设置(严选模式/非严选模式)

 

设置这个参数为nostrict

hive> set hive.exec.dynimac.partiton.mode=nostrict

 默认情况下是strict

2)动态分区的相关参数

hive.exec.max.dynimac.partition.pernode  这个参数表示每个mr执行的节点上,能创建的最大分区数量(默认100)

hive.exec.max.dynimac.partition  这个参数表示所有mr执行的节点上,能创建的最大分区数量(默认1000)

hive.exec.max.creat.files  这个参数代表所有mr job能创建文件的最大数量

3)动态分区加载数据的方法

第一步:创建原数据表

第二部:load data加载数据到原数据表

第三部:使用from into table inset into table select 。。。。加载数据

4)静态分区与动态分区的区别

静态分区是手动指定分区的,动态分区是根据数据来判断

5)静态分区结合动态分区使用

动静结合使用的话,静态分区值必须在动态分区值的前面

你可能感兴趣的:(hive)