天天看點

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

以下步驟講解了配備 Standalone 資料總管的 Spark 應用程式的生命周期,圖3-8 顯示了Spark程式的排程過程:

(1)使用者使用 spark-submit 指令送出一個 Spark 應用程式。

(2)spark-submit 在同一節點(用戶端模式)或叢集(叢集模式)上啟動驅動程序,并調用由使用者指定的 main 方法。

(3)驅動程序聯系叢集管理器,根據提供的配置參數來請求啟動執行程序 JVM 所需的資源。

(4)叢集管理器在工作機節點上啟動執行程序 JVM。

(5)驅動程序掃描使用者應用程式。根據程式中的 RDD 動作和變換,Spark 會建立一個運算圖。

(6)當調用一個動作(如 collect)時,圖會被送出到一個有向無環圖(DAG)排程程式。DAG 排程程式将運算圖劃分成一些階段。

(7)一個階段由基于輸入資料分區的任務組成。DAG 排程程式會通過流水線把運算符連一起,進而優化運算圖。例如,很多映射(map)運算符可以排程到一個階段中。這種優化對 Spark 的性能是很關鍵的。DAG 排程程式的最終結果是一組階段。

(8)這些階段會被傳遞到任務排程程式。任務排程程式通過叢集管理器(Spark Standalone / Yarn / Mesos)啟動任務。任務排程器并不知道階段之間的依賴性。

(9)任務在執行程序上運作,進而計算和儲存結果。

(10)如果驅動程序的 main 方法退出,或者它調用了 SparkContext.stop(),它就會終止執行程序并從叢集管理器釋放資源。

圖3-8描述了 Spark 程式的排程過程:

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

從内部來看,每個任務會執行相同的步驟:

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

讓我們來了解在 Spark 中使用的術語,然後再進一步深入探讨 Spark 程式的生命周期:

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

在某些情況下,各階段的實體集合不一定會完全和邏輯 RDD 圖做到 1:1 對應。當無需移動資料就能根據其父節點計算出 RDD 時,就可以産生流水線。例如,當使用者順序地調用 map 和 filter 時,那些調用就可以被折疊成單個變換,它先映射再過濾每個元素。但是,複雜的 RDD 圖會由 DAG 排程器劃分為多個階段。

利用 1.4 及更高版本的 Spark 管理界面,Spark 的事件時間軸和 DAG 可視化變得容易了。讓我們執行以下代碼來檢視一個作業及其各階段的 DAG 可視化:

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

圖3-9 顯示了上面的單詞計數代碼作業及其各階段的可視化 DAG。它顯示作業被分為兩個階段,因為在這種情況下發生了資料的混排。

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

圖3-10 顯示了階段 0 的事件時間軸,它指明了每個任務所用的時間。

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

在此簡要說明 Spark 執行摘要:

《Spark與Hadoop大資料分析》——3.3 Spark 程式的生命周期

繼續閱讀