最近因為手抖,在Spark中給自己挖了一個數(shù)據(jù)傾斜的坑。為了解決這個問題,順便研究了下Spark分區(qū)器的原理,趁著周末加班總結(jié)一下~
先說說數(shù)據(jù)傾斜
數(shù)據(jù)傾斜是指Spark中的RDD在計算的時候,每個RDD內(nèi)部的分區(qū)包含的數(shù)據(jù)不平均。比如一共有5個分區(qū),其中一個占有了90%的數(shù)據(jù),這就導(dǎo)致本來5個分區(qū)可以5個人一起并行干活,結(jié)果四個人不怎么干活,工作全都壓到一個人身上了。遇到這種問題,網(wǎng)上有很多的解決辦法:
比如這篇寫的就不錯:http://www.cnblogs.com/jasongj/p/6508150.html
但是如果是底層數(shù)據(jù)的問題,無論怎么優(yōu)化,還是無法解決數(shù)據(jù)傾斜的。
比如你想要對某個rdd做groupby,然后做join操作,如果分組的key就是分布不均勻的,那么真樣都是無法優(yōu)化的。因為一旦這個key被切分,就無法完整的做join了,如果不對這個key切分,必然會造成對應(yīng)的分區(qū)數(shù)據(jù)傾斜。
不過,了解數(shù)據(jù)為什么會傾斜還是很重要的,繼續(xù)往下看吧!