3、Spark會使用譜系圖來記錄這些不同RDD之間的依賴關系,Spark需要用這些信息來按需計算每一個RDD,也能夠依托譜系圖在持久化的RDD丟失部份數據時用來恢復所丟失的數據。(以下圖,過濾errorsRDD與warningsRDD,終究調用union函數)
窄依賴 (narrowdependencies) 和寬依賴 (widedependencies) 。窄依賴是指 父 RDD 的每一個分區都只被子 RDD 的1個分區所使用 。相應的,那末寬依賴就是指父 RDD 的分區被多個子 RDD 的分區所依賴。例如, map 就是1種窄依賴,而 join 則會致使寬依賴
這類劃分有兩個用途。首先,窄依賴支持在1個結點上管道化履行。例如基于1對1的關系,可以在 filter 以后履行 map 。其次,窄依賴支持更高效的故障還原。由于對窄依賴,只有丟失的父 RDD 的分區需要重新計算。而對寬依賴,1個結點的故障可能致使來自所有父 RDD 的分區丟失,因此就需要完全重新履行。因此對寬依賴,Spark 會在持有各個父分區的結點上,將中間數據持久化來簡化故障還原,就像 MapReduce 會持久化 map 的輸出1樣。
RDD工作原理:
RDD(Resilient DistributedDatasets)[1] ,彈性散布式數據集,是散布式內存的1個抽象概念,RDD提供了1種高度受限的同享內存模型,即RDD是只讀的記錄分區的集合,只能通過在其他RDD履行肯定的轉換操作(如map、join和group by)而創建,但是這些限制使得實現容錯的開消很低。對開發者而言,RDD可以看做是Spark的1個對象,它本身運行于內存中,如讀文件是1個RDD,對文件計算是1個RDD,結果集也是1個RDD,不同的分片、數據之間的依賴、key-value類型的map數據都可以看作RDD。
主要分為3部份:創建RDD對象,DAG調度器創建履行計劃,Task調度器分配任務并調度Worker開始運行。
SparkContext(RDD相干操作)→通過(提交作業)→(遍歷RDD拆分stage→生成作業)DAGScheduler→通過(提交任務集)→任務調度管理(TaskScheduler)→通過(依照資源獲得任務)→任務調度管理(TaskSetManager)
Transformation返回值還是1個RDD。它使用了鏈式調用的設計模式,對1個RDD進行計算后,變換成另外1個RDD,然后這個RDD又可以進行另外1次轉換。這個進程是散布式的。
Action返回值不是1個RDD。它要末是1個Scala的普通集合,要末是1個值,要末是空,終究或返回到Driver程序,或把RDD寫入到文件系統中
轉換(Transformations)(如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是說從1個RDD轉換生成另外一個RDD的操作不是馬上履行,Spark在遇到Transformations操作時只會記錄需要這樣的操作,其實不會去履行,需要等到有Actions操作的時候才會真正啟動計算進程進行計算。
操作(Actions)(如:count, collect, save等),Actions操作會返回結果或把RDD數據寫到存儲系統中。Actions是觸發Spark啟動計算的動因。
它們本質區分是:Transformation返回值還是1個RDD。它使用了鏈式調用的設計模式,對1個RDD進行計算后,變換成另外1個RDD,然后這個RDD又可以進行另外1次轉換。這個進程是散布式的。Action返回值不是1個RDD。它要末是1個Scala的普通集合,要末是1個值,要末是空,終究或返回到Driver程序,或把RDD寫入到文件系統中。關于這兩個動作,在Spark開發指南中會有就進1步的詳細介紹,它們是基于Spark開發的核心。
參考:http://www.itshipin.com/article/article110.html
上一篇 [Java]ITOO初步了解