Spark高薪(SparkCore,SparkSQL,SparkStreaming,運維與監控


解析一:resilient distributed dataset (RDD)

resilient distributed dataset (RDD):彈性分佈式數據集,有容錯機制可並行執行。


分佈式即體現在每個rdd分多個partition,每個partition在執行時爲一個task,會被master分配到某一個worker執行器(Executor)的某一個core中。


彈性體現在流水線思想(pipe),即rdd方法分爲transformations和actions方法,兩者的官方解釋爲:RDDs support two types of operations: transformations, which create a new dataset from an existing one, and actions, which return a value to the driver program after running a computation on the dataset。transformations類方法在執行過程中,只會記錄每個rdd的依賴,不會立即執行,在這個過程中,可以彈性的處理partition。當action類方法執行時,會按照依賴,每個rdd去父rdd中要數據。


解析二:窄依賴(完全依賴)和寬依賴(部分依賴)

transformations類方法的依賴分爲窄依賴(完全依賴)和寬依賴(部分依賴),窄依賴可以理解爲:每個父rdd的一個分區的數據只會給一個子rdd的一個分區(一個task的數據只會給流水線下游的一個task),子rdd的分區中數據來自一個多個父rdd的分區的數據;寬依賴肯定會有某些或全部父rdd的task數據給多個子rdd的task。


當寬依賴時,需要進行shuffle,此時,會按照shuffle切分成一個個stage。


整個job的過程是一個有向無環圖(DAG),如下圖,是rdd方法leftOuterJoin執行時的一個DAG,rdd leftOuterJoin是寬依賴,因此要劃分stage,並會發生shuffle;當觸發action類方法如collect時會按照依賴往dirver拉數據時,會從rdd leftOuterJoin的task中拿數據,從而自下而上,觸發整個流水線作業。




Dependency

NarrowDependency(窄依賴)

OneToOneDependency

RangeDependency

ShuffleDependency(寬依賴)


解析三:shuffle

ShuffleManager

HashShuffleManager

SortShuffleManager(默認)

目前默認的shuffle方式爲:SortShuffleManager


由於一個worker上運行多個task,每個worker上生成的所有臨時文件數是reduce的數量


具體reduceByKey的shuffle過程如下,在map端會進行shuffle寫,會先寫到緩存,然後寫到磁盤;在reduce端會進行shuffle讀,讀取時會判斷取遠程讀還是在本機讀,讀取時也會先寫到緩存。




shuffle時,等map端的父stage寫完後,reduce端纔會去進行fetch,fetch的時候是邊fetch邊處理,不會等全部fetch完再處理。


另外一種方式,hashShuffle,每個worker上會生成map*reduce個磁盤文件,會增大磁盤io以及內存的壓力。


shuffle涉及的設置如下:


1、shuffle方式(sort、hash)

spark.shuffle.manager


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章