数据倾斜产生
根本原因是上游task经过shuffle发往下游task的某一个或多个key的数量
量特别大, 导致下游一个task需要处理的数据远远大于其他task;
一. 定位倾斜算子:
1. 在spark UI(8080)中找到这个application的job那些耗时明显过长的stage,定位倾斜算子;
2. 使用spark的sample()算子随机抽样,定位倾斜key;
二. 处理数据倾斜
1. 提高shuffle并行度
reducebykey中的shuffle read task的默认值为200,也就是同时用200个task来处理任务, 调大参数;
2. 聚合类数据倾斜
采用两阶段聚合(局部聚合+全局聚合)
首先定位倾斜key, 给倾斜key打上10以内的随机前缀(加盐操作),
再进行聚合, 后用map切割一下封装成元组再做聚合, 可以提高数倍效率;
3. join类数据倾斜
reduce端join 转 map端join
如果两表数据量都很小, 不管他们是大大表还是大小表join, 倾斜都不用处理;
大小表join:
小表的数据量不大,比如1G之内,
将小表数据拉倒driver端广播出去, 这样每一个executor中都有这个小表的cache
下游reduce不会产生数据的分发, 从而避免了数据倾斜;
大大表join;
采样倾斜key并拆分join操作
通过sample()算子抽样定位倾斜