提高shuffle操作的reduce并行度
将reduce task的数量,变多,就可以让每个reducetask分配到更少的数据量,这样的话,也许就可以缓解,或者甚至是基本解决掉数据倾斜的问题
提升shuffle reduce端并行度,怎么来操作
很简单,主要给我们所有的shuffle算子,比如groupByKey,countByKey,reduceByKey,在调用的时候,传入进去一个参数,一个数字,那个数字,就代表了那个shuffle操作的reduce端的并行度,那么在进行shuffle操作的时候,就会对应着创建指定数量的reduce task.
这样的话,就可以让每个reduce task分配到更少的数据,基本上可以缓解数据倾斜的问题,比如说,原本某个task分配数据特别多,直接OOM,内存溢出了,程序没法运行,直接挂掉。按照log,找到发生数据倾斜的shuffle操作,给它传入一个并行度数字,这样的话,原先那个task分配到的数据,肯定会变少,就至少可以避免OOM的情况,程序至少是可以跑起来。
1. 如果最理想的情况下,提升并行度以后,减轻了数据倾斜的问题,或者甚至可以让数据倾斜的现象忽略不计,那么就最好,就不用做其他的数据倾斜的解决方案了
2. 不太理想的情况下,就是比如之前某个task运行特别慢,要5个小时,现在稍微快了一点,变成了4个小时,或者是原先运行到某个task,直接OOM,现在至少不会OOM,但是那个task运行特别慢,要5个小时才能跑完
那么,如果出现第二种情况的话,就立即放弃这种,选择后边的方案
具体的操作
//计算各个品类的点击个数,如果某个品类点击了1000万次,其他品类点击了10万次,也会出现数据倾斜
rdd.reduceByKey(new function(),1000)这样写就可以,这时reduce端的task就是1000个