1. 数据倾斜的产生:
在 Spark 中,首先要明确产生数据倾斜的原因,数据倾斜产生的原因一般是某一个或者某几个 Partition 的数据特别大时,导致这几个 Partition 计算需要消耗相当长的时间,从而影响整个 job 执行变慢。
在 Spark 中同一个应用程序分成多个 stage,这些 stage 之间是串行执行的,而一个 stage 里面有多个 task 是可以并行执行的(一个分区对应一个 task),如果一个 Partition 的数据特别大,那么这个 task 执行时间会很长,会导致接下来的 stage 无法执行,从而导致整个 job 执行变慢。
2. 数据倾斜解决办法:
(1)可以选用合适的 key 作为分区的 key
(2)或者自定义相关的 partitioner
(3)或者通过加盐或者哈希值来拆分这些 key,从而将这些数据被平均地分散到不同的 partition 中去执行。
如下算子会导致 shuffle 操作,是导致数据倾斜可能发生的关键点所在:
groupByKey;reduceByKey;aggregaByKey;join;cogroup;
盐(Salt)
在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为 “加盐”。