解析一: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