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