hive数据倾斜

hive数据倾斜以及处理

hive常用语句
mysql和hive的行列转换
目录
1,数据倾斜原因
2,HQL中数据倾斜诱发场景
3,数据倾斜处理
4,hive数据倾斜优化

1.数据倾斜原因

A:key 分布不均匀   
B:业务数据本身的特性  
C:建表考虑不周全   
D:某些 HQL 语句本身就存在数据倾斜

2.HQL中数据倾斜诱发场景

A、group by 不和聚集函数搭配使用的时候

B、count(distinct),在数据量大的情况下,容易数据倾斜,因为 count(distinct)是按 group by 字段分组,按 distinct 字段排序

C、 小表关联超大表 join(join关联时)

3.数据倾斜处理

A.空值产生的数据倾斜

解决方案 1:关联字段,eg:user_id 为空的不参与关联
select * from log a join user b on a.user_id is not null and a.user_id = b.user_id
union all
select * from log c where c.user_id is null;
解决方案 2:赋予空值新的 key 值
说明:concat函数是字符串连接函数,利用case when 进行匹配

select * from log a left outer join user b on
case when a.user_id is null then concat(‘hive’,rand()) else a.user_id end = b.user_id
B.不同数据类型关联产生数据倾斜
解决方案
把数字类型 id 转换成 string 类型的 id

select * from user a left outer join log b on b.user_id = cast(a.user_id as string)
C.大小表关联查询产生数据倾斜
注意:使用map join解决小表关联大表造成的数据倾斜问题。这个方法使用的频率很高。

在 hive0.11 版本以后会自动开启 map join 优化,由两个参数控制:
set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启
set hive.mapjoin.smalltable.filesize=25000000 //设置小表不超过多大时开启 mapjoin 优化

4.hive数据倾斜优化(性能优化)

1.合理设置map,reducetask的个数
2.合理设置分区分桶表,减小处理数据量
3.GROUP BY操作
  进行GROUP BY操作时需要注意一下几点:
Map端部分聚合
  hive.map.aggr=true(用于设定是否在 map 端进行聚合,默认值为真) hive.groupby.mapaggr.checkinterval=100000(用于设定 map 端进行聚合操作的条目数)
有数据倾斜时进行负载均衡
  此处需要设定 hive.groupby.skewindata
4.和并小文件
  我们知道文件数目小,容易在文件存储端造成瓶颈,给 HDFS 带来压力,影响处理效率。对此,可以通过合并Map和Reduce的结果文件来消除这样的影响。
  用于设置合并属性的参数有:
是否合并Map输出文件:hive.merge.mapfiles=true(默认值为真)
是否合并Reduce 端输出文件:hive.merge.mapredfiles=false(默认值为假)
合并文件的大小:hive.merge.size.per.task=25610001000(默认值为 256000000)

实际使用

脚本中
set hive.cli.print.header=false;
增加可读性。
set hive.auto.convert.join = false;
大表关联小表,把小表自动加载到内存中,需要确认配置为true,相当于写了一个mapjoin;
默认小表 大小25M.
hive常用语句
mysql和hive的行列转换

你可能感兴趣的:(hive专栏)