7.1 Map倾斜
由于读入数据的文件大小分布不均匀,会导致有些map instance读取并且处理的数据特别多,造成map端长尾。
导致长尾的原因:
- 大小不均匀且小文件特别多,引起长尾
- map端聚合时文件的某个值特别多,主要是count distinct
处理方法:
- 设置参数合并小文件
- set odps.sql.mapper.merge.limit.size = 64
- set odps.sql.mapper.split.size=256
使用distribute by rand() 打乱map端读取数据的数据分布
7.2 Join倾斜
join任务将join key相同的数据分发到同一个执行instance
三种常见的场景:join的某路输入比较小,使用MapJoin避免分发引起的长尾
- 空值导致的长尾,将空值处理成随机值,结果再过滤随机值
- 热点值导致的长尾,将热点值和非热点值分开处理,结果union
解决方式:
- mapjoin
- 处理空值
- 处理热点值
join负载均衡参数
对一个表按照维度对不同的列进行count distinct操作,造成map端数据膨胀,使下游的join和reduce出现链路上的长尾
- map端聚合导致key值分布不均匀
- 动态分区时小文件过多
- 多个distinct会导致数据多次分发