Spark分析之Dependency

Spark分析之Dependency

在Spark中,每一個RDD是對于數據集在某一狀態下的表現形式,比如說:map、filter、group by等都算一次操作,這個狀態有可能是從前一狀態轉換而來的;

因此換句話說一個RDD可能與之前的RDD(s)有依賴關系;RDD之間存在依賴關系;

根據依賴關系的不同,可以將RDD分成兩種不同的類型:寬依賴和窄依賴。

窄依賴:一個父RDD的partition至多被子RDD的某個partition使用一次;

寬依賴:一個父RDD的partition會被子RDD的partition使用多次,需要shuffle操作;

圖中方框描述:外面的大方框是一個RDD,里面的小方塊是RDD中的partition,多個partition組成一個RDD

窄依賴

定義:一個父RDD的partition至多被子RDD的某個partition使用一次;

不需要shuffle,partition范圍不會改變,一個partition經過transform后還是一個partition,雖然內容發生了變化;可以進行pipeline計算,快速完成;

在某個節點上可以一次性全部計算完所有的父partition(pipeline流水式的計算方式):

a.map().filter().reduceByKey() 這樣多步操作一次性計算完畢,而不需要第一步執行完后保存起來,第二步再去讀取再計算再存儲。。。。。。

窄依賴可以在單節點上完成運算,非常高效。

容錯:某個partition掛了,快速將丟失的partition并行計算出來。

容錯和計算速度都比寬依賴強。

窄依賴又分為兩種:

OneToOneDependency:一對一的依賴,一父一子,最典型的是map/filter。

RangeDependency:一定范圍的RDD直接對應,最典型的是Union。

parent RDD的某個分區的partitions對應到child RDD中某個區間的partitions;

union:多個parent RDD合并到一個chind RDD,故每個parent RDD都對應到child RDD中的一個區間;

注意:union不會把多個partition合并成一個partition,而是簡單的把多個RDD的partitions放到一個RDD中,partition不會發生變化。

寬依賴

定義:一個父RDD的partition會被子RDD的partition使用多次;只能前面的算好后才能進行后續的計算;只有等到父partition的所有數據都傳輸到各個節點后才能計算(經典的mapreduce場景)

容錯:某個partition掛了,要計算前面所有的父partition,代價很大。

spark是把map部分的數據計算完成后物化到map端的磁盤上,掛了之后直接從磁盤中讀取即可。

class ShuffleDependency[K, V]( @transient rdd: RDD[_ <: Product2[K, V]], val partitioner: Partitioner, val serializerClass: String = null) extends Dependency(rdd.asInstanceOf[RDD[Product2[K, V]]]) { val shuffleId: Int = rdd.context.newShuffleId()}

首先:需要基于PairRDD,因為一般需要依據key進行shuffle,所以數據結構往往是key-value;

其次:由于需要shuffle,所以就需要給出partitioner;

然后:shuffle不像map可以在local運行,往往需要網絡傳輸或存儲,所以需要serializerClass;

最后:每個shuffle需要分配一個全局的id,context.newShuffleId()的實現就是把全局id累加;

免責聲明:本文僅代表文章作者的個人觀點,與本站無關。其原創性、真實性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容文字的真實性、完整性和原創性本站不作任何保證或承諾,請讀者僅作參考,并自行核實相關內容。

http://www.eoauzbr.cn/style/images/nopic.gif
?
分享
評論
首頁
山东十一选五遗漏 安徽十一选五开奖结果图库 老快3历史开奖结果 七星彩走势图 麻将玩法技巧大全 北京赛车pk博彩网 山东群英会 视频播爵士vs火箭 秒速牛牛官网 山西11选5开奖时 日本av女优最受欢迎排行榜 湖北十一选五基本走势 秦晋棋牌麻将官网 北京十一选五结果查询 浙江20选5开奖公 步行者日记 澳洲幸运10走势图