DataFrame、DataSet 和 Spark SQL 的實際執行流程都是相同的:
1.進行 DataFrame/Dataset/SQL 編程;
2.如果是有效的代碼,即代碼沒有編譯錯誤,Spark 會將其轉換爲一個邏輯計劃;
3.Spark 將此邏輯計劃轉換爲物理計劃,同時進行代碼優化;
4.Spark 然後在集羣上執行這個物理計劃 (基於 RDD 操作) 。
4.1 邏輯計劃(Logical Plan)
執行的第一個階段是將用戶代碼轉換成一個邏輯計劃。它首先將用戶代碼轉換成 unresolved logical plan
(未解決的邏輯計劃),之所以這個計劃是未解決的,是因爲儘管您的代碼在語法上是正確的,但是它引用的表或列可能不存在。 Spark 使用 analyzer
(分析器) 基於 catalog
(存儲的所有表和 DataFrames
的信息) 進行解析。解析失敗則拒絕執行,解析成功則將結果傳給 Catalyst
優化器 (Catalyst Optimizer
),優化器是一組規則的集合,用於優化邏輯計劃,通過謂詞下推等方式進行優化,最終輸出優化後的邏輯執行計劃
4.2 物理計劃(Physical Plan)
得到優化後的邏輯計劃後,Spark 就開始了物理計劃過程。 它通過生成不同的物理執行策略,並通過成本模型來比較它們,從而選擇一個最優的物理計劃在集羣上面執行的。物理規劃的輸出結果是一系列的 RDDs 和轉換關係 (transformations)。
4.3 執行
在選擇一個物理計劃後,Spark 運行其 RDDs 代碼,並在運行時執行進一步的優化,生成本地 Java 字節碼,最後將運行結果返回給用戶。