RDD運行原理

RDD產生的原因

        在之前的機器學習裏以及交互式挖掘等經常會涉及很多迭代式計算,這些迭代計算會涉及到一箇中間結果計算的重用問題,MapReduce是把中間結果寫入到磁盤裏面,下次要使用的時候再從磁盤裏讀取中間結果,這樣就會帶來大量化的磁盤讀寫開銷以及序列化與反序列化的開銷。這裏說的序列化是指將內存中的java對象進行轉換爲存儲或傳輸的格式,比如說可以將java對象序列化爲二進制對象或ssm文本格式,方便在網絡上存儲或傳輸。而將二進制或ssm文本還原成java對象,則稱爲反序列化。RDD就是爲了避免這些問題而產生的。

        RDD提供了抽象的數據結構,從而不用擔心底層的分佈式特性,而只需要經我們的邏輯表達爲一個個轉換處理(不論多複雜的邏輯都可以將其變爲RDD轉換),不同的轉換關係就形成了rdd的轉換的依賴關係,即爲有向無環圖DAG。

對於該依賴圖我們可以進行優化處理,從而實現相應的管道處理,一個操作結束後,數據不需要進入磁盤,馬上就可以進行下一個操作。

        一個RDD就是一個分佈式集合,其本質爲一個只讀(不能修改)的分區記錄集合,一個RDD可以存儲幾十G或多少個T的數據,一個單機存不下,我們可以將其分佈式的保存在很多臺機器上,將RDD分成若干個分區,每個分區放在不同的機器上去,每個分區就是一個數據片段,把它分佈在不同結點上面,數據分佈在不同結點上,從而就可以使計算分佈式並行。這就是其爲什麼可以加快速度,因爲數據被分佈式存儲了,所以計算就可以在多臺計算上並行的發生。

        RDD提供了一種高度受限的共享內存模型,這裏說的高度受限是因爲RDD爲只讀,RDD一旦生成就不能對其發生變化。

RDD在轉換當中是可以發生修改的,通過生成一個新的RDD來完成數據修改的目的。

RDD提供了兩種類型的操作:動作類型操作(action)和轉換類型操作(transformation),這兩種操作都是粗粒度的轉換操作,粗粒度轉換意思是一次只能針對RDD全集進行轉換(一個記錄全集進行轉換),而不支持對單挑進行修改。

雖然RDD爲高度受限的內存模型,同時只能進行粗粒度轉換,但是它卻不影響功能操作。

Spark提供了RDD的的API,程序員可通過調用API實現對RDD的各種操作。

RDD的典型執行過程:

RDD的惰性機制,RDD的一系列轉換操作並不會真正進行轉換,其只記錄的轉換的意圖,並不會真正發生計算,只有當遇到動作類型操作,它纔會從頭到尾執行計算。管道化是隻每次轉換過程中可以形成一個管道流,我們可直接將一個操作的輸出呈給下一個操作,而不需要將中間結果進行存儲處理。同時因爲操作非常多,每一個操作就非常簡單,將這些簡單的操作串聯起來就可以解決很多複雜的功能。

spark爲什麼能實現高效的計算呢?

第一,其有高效的容錯性;

第二,中間結果持久化內存RDD.cache(),數據在內存的多個RDD之間進行傳遞操作,避免了不必要的磁盤讀寫開銷

第三,避免了序列化及反序列化開銷

 

RDD的依賴關係

        一個RDD應用會分成多個作業關係,一個作業關係會分成多個階段(爲什麼一個作業會分成多個階段?)以什麼依據將一個作業拆分爲多個階段?這裏就涉及到寬依賴和窄依賴的問題,它決定是否拆分階段的依據。

        窄依賴不劃分階段,寬依賴劃分成多個階段。是否包含shuffle操作是區分寬依賴和窄依賴的依據。包含shuffle操作即爲寬依賴,沒有包含shuffle操作則稱爲窄依賴。

        

        像上圖這樣交叉洗牌的操作就稱爲shuffle操作。shuffle操作就是發生了很多來回數據交叉的分發。

寬依賴和窄依賴的區分

窄依賴特徵:一個父RDD分區對應一個子RDD的分區或者多個父RDD分區對應一個子RDD的分區。

      

寬依賴特徵:一個父RDD的一個分區對應多個子RDD的多個分區(即一個父親對應多個兒子)

                    

 

爲什麼寬依賴需要在shuffle操作處劃分成多個階段,而窄依賴就不要劃分呢?

這是因爲窄依賴可以進行流水線優化的,而寬依賴不能進行流水線優化。

 

spark優化機制

spark採用了fork/join機制,這是分佈式典型的優化機制。

此處爲RDD1轉換爲RDD2,但是在一個複雜的RDD應用中,可能會不斷地轉換。

一個單個的轉換就是一次fork/join,多個不同轉換串聯起來就說多個不同的fork/join。每次RDD操作都是一次fork/join,多個RDD串聯起來就是多個fork/join的組合。

多個fork/join組合怎麼能夠優化呢?

只要發生shuffle就會一定會寫入磁盤。優化就是讓數據中間不要落入磁盤中,直接在內存中就完成一個操作的輸出到下一個操作的輸入。一旦發生shuffle操作,一定是發生數據的交換(洗牌),這時候就需要寫入磁盤,進行操作。

在該圖中我們可以省去上海的join,從而達到優化的目的,最後飛行時長爲5小時。

上圖中因爲上海到廈門的人員分配有變動,即shuffle,不能取消上海的join,因此不能進行優化。

 

RDD運行過程

         首先提交所寫的rdd代碼給spark框架,spark框架會根據提供的代碼生成一個有向無環圖,叫DAG圖,DAG圖會提交給DAGScheduler,DAGScheduler會將其分成多個階段每個階段包含若干個任務,每個任務會被分配給TaskScheduler,TaskScheduler會把任務分配給工作節點上的Excutor進程,然後由Excutor進程派發出來的線程去執行任務,這樣就完成了一個工作,即爲RDD的整個執行過程。 

 

 

 

 

 

 

 

 

 

 

 

 

 

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