RDD通過對象中用戶定義的函數/方法進行一系列轉換。這些功能以任務的形式傳遞給執行者。 這些任務是在spark-core中定義的Scala類的實例。spark驅動程序如何序列化發送給執行程序的任務?
我假設用戶定義的函數/方法被包裝在一個任務對象中並傳遞給執行者。
如何執行人知道的是,需要執行 它被包裹在任務類中的方法?
序列化到底有多有用?
火花上下文如何讀取用戶代碼並將其轉換爲任務?
RDD通過對象中用戶定義的函數/方法進行一系列轉換。這些功能以任務的形式傳遞給執行者。 這些任務是在spark-core中定義的Scala類的實例。spark驅動程序如何序列化發送給執行程序的任務?
我假設用戶定義的函數/方法被包裝在一個任務對象中並傳遞給執行者。
如何執行人知道的是,需要執行 它被包裹在任務類中的方法?
序列化到底有多有用?
火花上下文如何讀取用戶代碼並將其轉換爲任務?
一點解釋:
如何執行者知道什麼是需要被包裹在任務類要執行的方法是什麼?
執行人收到任務描述一個RPC味精,見下文
究竟是怎樣的序列化有幫助嗎?
是,該任務包含由一個closureSerializer
連載怎樣火花背景讀取用戶代碼,並將其轉換爲任務的代碼?
在REPL envirenment,火花編譯用戶代碼的類文件,並把文件服務器上,執行器實現了一個自定義的類加載器,其裝載從駕駛員側的文件服務器的類;該類實際上是一個針對記錄迭代器運行的函數
從根本上通過的Spark函數基於Java Serialization。在Java中,您可以通過網絡將任意代碼傳遞給其他機器,可以是簡單的案例類或具有任何行爲的任何類。
只有一個需求 - 序列化類需要位於目標JVM的類路徑中。
在啓動時,當您使用它的jar
文件分發到所有Spark工作節點,它可以讓駕駛者序列化功能傳遞給工作節點,因爲序列化類是在類路徑可以反序列化,從驅動程序發送的任何功能。
Spark沒有爲RDD轉換定義任何特定的Task
類。如果您使用Scala的map
操作,則會發送scala Function1
的序列化版本。
如果您通過密鑰等使用聚合/減少,它可以是Function2
。無論如何,這不是Spark特有的,它只是普通的Scala(Java)類。
關於spark如何讀取用戶代碼並將其轉換爲任務?
驅動程序代碼生成作業,階段和任務。
整個驅動程序代碼可以作爲一個應用程序調用,每個動作構成一個工作。
作業提交給驅動程序時,作業分爲邏輯計劃和物理計劃。
在邏輯計劃中,轉換()會在一系列RDD中建立計算。 由於每個動作()都會觸發一個作業,因此在物理計劃期間,轉換的完整依賴關係圖將分成多個階段。與hadoop不同,hadoop的執行過程是固定的map-shuffle-sort-aggregate,spark沒有固定的執行過程。數據在實際需要時以流動方式計算。它從RDD的最終結果開始,並向後檢查RDD鏈,以找出計算最終結果所需的RDD和分區。在回溯期間,如果它遇到ShuffleDependency,它會切斷數據流並形成一個新的階段,通過NarrowDepedency離開RDD的通道。所以它打破了一個新階段的ShuffleDependency。
在每個階段中,執行任務並通過轉換對數據進行流水線處理。任務的數量相當於每個階段的RDD中的分區數量。
所有任務都打包在TaskSet中併發送到TaskScheduler。Driver actor將序列化的任務發送到工作者節點上的CoarseGrainedExecutorBackend Actor。執行者收到後,將其反序列化爲正常任務並運行以獲得結果。 TaskScheduler將被通知任務已完成,其結果將被處理
如果接收到的驅動程序任務是該階段中的最後一項任務,則會提交下一個階段。如果舞臺已經是最後一個舞臺,dagScheduler會被告知該作業已完成。
從Spark 1.4版本開始,Spark UI中添加了新的可視化。我們可以在哪裏看到不同階段的DAG可視化。