hive数据倾斜

数据倾斜缘由:

key分布不均,或者业务数据自己的特性,和sql语句自己就有数据倾斜,建表不规范的问题sql

例如:

1.大小表join,其中小表key集中 ,分发到某个或几个reduce上的数据远高于平均值apache

2.大表join大表,有特殊值好比0和空值过多 ,这些空值都有一个reduce处理很是慢markdown

3.group by 维度太小,某值过多,处理某值的reduce耗时负载均衡

4.count(distinct) 某特殊值过多,处理此特殊值耗时oop

表现:

某个reduce任务长时间在99%和100%,与其余reduce数据量差别很大,job数多spa

解决方法:

1.sql语句作列裁剪,使两表join数据量相对变少code

2.group by维度太小orm

hive.map.aggr=true; --map端部分聚合
hive.groupby.skewindata=true; --数据倾斜时,负载均衡,生成两个 MR JOB
复制代码

3.大小表join,走map join 小表数据比较小走内存 自动开启map join内存

set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=25000000; --即25M
复制代码

4.大表join大表把空值变成字符串加上随机数,把数据分发到不一样reduce上hadoop

例如:

nvl(字段,concat('hive',rand()))
复制代码

5.count(distinct xx)有大量特殊值 能够采用先去重 sum() group by 替换count(distinct)

6.不一样类型关联产生的数据倾斜,好比int和string把数据类型转换成字符类型 case(字段 string)

7.合并小文件

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --执行Map前进行小文件合并
复制代码

输出端:经过输出端小文件合并,减小产生的小文件数量。 --mapd端

set hive.merge.mapfiles=true;
复制代码

设置:启用小文件合并 - Map-Only做业,默认true; --reduce端

set hive.merge.mapredfiles=true;
复制代码

设置:启用小文件合并 - Map-Reduce做业,默认false;

hive.merge.size.per.task=268534456;
复制代码

8.减小job数,设置合理的map ,reduce 的task数

数据倾斜主要就是设置合理的map,reduce的task数,将大量数据均匀分发到reduce上。

相关文章
相关标签/搜索