我們要想對spark中RDD的分區(qū)進行一個簡單的了解的話征字,就不免要先了解一下hdfs的前世今生寻咒。
眾所周知兄朋,hdfs是一個非常不錯的分布式文件系統(tǒng)常拓,這是這么多年來大家有目共睹的渐溶。
hdfs文件為分布式存儲,每個文件都被切分為block(默認為128M)弄抬。為了達到容錯的目的茎辐,他們還提供為每個block存放了N個副本(默認為3個)。當然眉睹,以上說的這些也可以根據(jù)實際的環(huán)境業(yè)務調整。
多副本除了可以達到容錯的目的废膘,也為計算時數(shù)據(jù)的本地性提供了便捷竹海。當數(shù)據(jù)所在節(jié)點的計算資源不充足時,多副本機制可以不用遷移數(shù)據(jù)丐黄,直接在另一個副本所在節(jié)點計算即可斋配。此時看到這里,肯定就有人會問了灌闺,那如果所有副本所在的節(jié)點計算資源都不充足那該怎么辦?
問的很好艰争,一般會有一個配置來設置一個等待時長來等待的,假設等待時長為三秒桂对,如果超過三秒甩卓,還沒有空閑資源,就會分配給別的副本所在節(jié)點計算的蕉斜,如果再別的副本所在節(jié)點也需等待且超過了三秒逾柿。則就會啟動數(shù)據(jù)遷移了(諸多因素影響,代價就比較大了)宅此。
接下來我們就介紹RDD机错,RDD是什么?彈性分布式數(shù)據(jù)集。
彈性:并不是指他可以動態(tài)擴展父腕,而是血統(tǒng)容錯機制弱匪。
分布式:顧名思義,RDD會在多個節(jié)點上存儲璧亮,就和hdfs的分布式道理是一樣的萧诫。hdfs文件被切分為多個block存儲在各個節(jié)點上斥难,而RDD是被切分為多個partition。不同的partition可能在不同的節(jié)點上财搁。
再spark讀取hdfs的場景下蘸炸,spark把hdfs的block讀到內存就會抽象為spark的partition。至于后續(xù)遇到shuffle的操作尖奔,RDD的partition可以根據(jù)Hash再次進行劃分(一般pairRDD是使用key做Hash再取余來劃分partition)搭儒。
再spark計算末尾,一般會把數(shù)據(jù)做持久化到hive提茁,hbase淹禾,hdfs等等。我們就拿hdfs舉例茴扁,將RDD持久化到hdfs上铃岔,RDD的每個partition就會存成一個文件,如果文件小于128M峭火,就可以理解為一個partition對應hdfs的一個block毁习。反之,如果大于128M卖丸,就會被且分為多個block纺且,這樣,一個partition就會對應多個block稍浆。
鑒于上述partition大于128M的情況载碌,在做sparkStreaming增量數(shù)據(jù)累加時一定要記得調整RDD的分區(qū)數(shù)。假設衅枫,第一次保存RDD時10個partition嫁艇,每個partition有140M。那么該RDD保存在hdfs上就會有20個block弦撩,下一批次重新讀取hdfs上的這些數(shù)據(jù)步咪,RDD的partition個數(shù)就會變?yōu)?0個。再后續(xù)有類似union的操作益楼,導致partition增加歧斟,但是程序有沒有repartition或者進過shuffle的重新分區(qū),這樣就導致這部分數(shù)據(jù)的partition無限增加偏形,這樣一直下去肯定是會出問題的静袖。所以,類似這樣的情景俊扭,再程序開發(fā)結束一定要審查需不需要重新分區(qū)队橙。
安利一個特別熱心的編程樂園群:624108656