前言:数据倾斜大多数是由于数据本身的分布不均匀。故而需要我们使用诸如列裁剪、Mapjoin、GroupBy等方法进行处理。
数据倾斜表现:
1、任务日志进度长度为99%,在日志监控进度条显示只有几个reduce进度一直没有完成。
2、某一reduce处理时长>平均处理时长
3、job数过多
数据倾斜原因分析:
1、key分布不均
2、业务数据本身存在不均匀情况
3、关联字段重复数据较多
解决方法:
1、join定位:
第一:主表驱动表应该选择分布均匀的表作为驱动表,并做好列裁剪。
第二:大小表Join,需要记得使用map join,小表会先进入内存,在map端即会完成reduce.
第三:此种情形最为常用!!!大表join大表时,关联字段存在大量空值null key
解决方法为把空值null key变成字符串加上随机数!!!可以0把由于数据倾斜而导致的数据集中到一个reduce上处理的情形,打散到不同的reduce上,9生成多个reduce!!!
on case when haha.id is null then concat('hive',rand()) else
haha.id end = xixi.id
2、不同数据类型关联也会产生数据倾斜滴!
例如注册表中ID字段为int类型,登录表中ID字段即有string类型,也有int类型。当按照ID字段进行两表之间的join操作时,默认的Hash操作会按int类型的ID来进行分配,这样会导致所有string类型ID的记录统统统统统统都都都都分配到一个Reduce里面去!!!
解决方法:把数字类型转换成字符串类型
on haha.ID = cast(xixi.ID as string)