spark数据倾斜解决方案

1、适当提高reducer端的并行度

适用场景:

如果某个 Task 有 100个 Key ·且数据量特别大,就极有可能导致 OOM 或者任务运行特别慢,此时如果把并行度变大,则可以分解
该 Task 的数据量,例如,把原本 Task 的 100 个 Key 分解给 10 个 Task,这就可以减少每个 Task 的数据量,从而有可能解决 OOM 和任务运行慢的问题 。


2、使用随机 Key 实现双重聚合(reducebykey)

使用对 Key 值随机数前缀的处理技巧 , 对 Key 值进行二次聚合。
(1 )第 一 次聚合(局部聚合) : 对每个 Key 值加上一个随机数 ,执行第一次 reduceByKey聚合操作。
(2 )第 二 次聚合(双重聚合) : 去掉 Key 值 的前缀随机数 ,执行第二次 reduceByKey 聚合,最终得到全局聚合的结果。
适用场景:

随机 Key 适用于 groupByKey、 reduceByKey 等算子操作数据时某些 Key 值发生数据倾斜的情况。例如 , 电商广告点击系统中 ,如果根据用户点击的省份进行汇聚 , 原来的 Key 值是省份,如果某些省份的 Value 值特别多 , 发生 了 数据倾斜 , 可以将每个 Key 拆分成多个Key ,加上随机数前缀将 Key 值打散 , 组拼成 random_省份的新的 Key 值 ,调用 reduceByKey做局部聚合,然后再将 random一前缀去掉,形成的 Key 值仍为省份,再调用 reduceByKey,进行全局聚合。


3、首先对倾斜的 Keys 采样后进行单独的 Join 操作

适用场景:

两个 RDD 进行 Join 操作 ,如果一个rdd 有严重的数据倾斜,那我们可以通过采样的方式发现 RDDI 中有严重的数据倾斜的 Key , 然后将原来一个 RDDl 拆分成 RDDll C产生倾斜 Key 的数据〉和 RDD12 C不产生倾斜 Key 的数据),把 RDDI l 、 RDD1 2 分别和 RDD2进行 Joi n 操作, 然后把 Join 操作后的结果进行 Union 操作 。

原理:

如果 RDDl l 中的数据量特别多 ,此时之所以能够缓解数据倾斜,是因为采用了 Spark Core 天然的并行机制对 RDDl 1 中的同样一个 Key 的数据进行了拆分,从而达到让原本倾斜的 Key 分散到不同的 Task 的目的,就缓解了数据倾斜。
 

发布了159 篇原创文章 · 获赞 75 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/xuehuagongzi000/article/details/104053052