您好,登錄后才能下訂單哦!
Spark閉包中driver及executor程序代碼是怎樣執行的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
閉包的作用可以理解為:函數可以訪問函數外部定義的變量,但是函數內部對該變量進行的修改,在函數外是不可見的,即對函數外源變量不會產生影響。
其實,在學習Spark時,一個比較難理解的點就是,在集群模式下,定義的變量和方法作用域的范圍和生命周期。這在你操作RDD時,比如調用一些函數map、foreach時,訪問其外部變量進行操作時,很容易產生疑惑。為什么我本地程序運行良好且結果正確,放到集群上卻得不到想要的結果呢?
但是在生產中,我們的任務都是在集群模式下運行,如何能滿足這種業務場景呢?
這就必須引出一個后續要重點講解的概念:Accumulator即累加器。Spark中的累加器專門用于提供一種機制,用于在集群中的各個worker節點之間執行時安全地更新變量。
首先,對RDD相關的操作需要傳入閉包函數,如果這個函數需要訪問外部定義的變量,就需要滿足一定條件(比如必須可被序列化),否則會拋出運行時異常。閉包函數在最終傳入到executor執行,需要經歷以下步驟:
1.driver通過反射,運行時找到閉包訪問的變量,并封裝成一個對象,然后序列化該對象
2.將序列化后的對象通過網絡傳輸到worker節點
3.worker節點反序列化閉包對象
4.worker節點的executor執行閉包函數
driver是運行用戶編寫Application 的main()函數的地方,具體負責DAG的構建、任務的劃分、task的生成與調度等。job,stage,task生成都離不開rdd自身,rdd的相關的操作不能缺少driver端的sparksession/sparkcontext。
最后做個總結:所有對RDD具體數據的操作都是在executor上執行的,所有對rdd自身的操作都是在driver上執行的。比如foreach、foreachPartition都是針對rdd內部數據進行處理的,所以我們傳遞給這些算子的函數都是執行于executor端的。但是像foreachRDD、transform則是對RDD本身進行一列操作,所以它的參數函數是執行在driver端的,那么它內部是可以使用外部變量,比如在SparkStreaming程序中操作offset、動態更新廣播變量等。
關于Spark閉包中driver及executor程序代碼是怎樣執行的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。