Spark程式碼在叢集上執行過程理解

Just Jump發表於2020-10-10

spark程式碼是如何在叢集上執行的?

總體上可以概述為4步:

  1. 寫DataFrame/Dataset/SQL 程式碼(通過console或spark-submit提交程式碼)
  2. 如果程式碼有效,Spark將此轉成邏輯計劃(Logical Plan)
  3. Spark對計劃中的一系列transform操作進行優化,並將邏輯計劃轉成物理計劃(Physical Plan)
  4. Spark在叢集上執行(基於RDD操作的)物理計劃

整體上看,提交的程式碼要通過 Catalyst優化器。它會決定程式碼執不執行,以及具體執行的物理計劃如何,最後程式碼執行完成並返回結果給使用者。

 

邏輯計劃Logical Planning

spark程式碼執行的第一個階段就是獲取程式碼,並轉成邏輯計劃logical plan。

邏輯計劃只是將使用者提交的一系列表示式轉成最優化的檢視,僅僅表示這一系列抽象的transformation變換,而不涉及執行器executors或驅動器driver。

這個過程是如何實現的呢?都包括哪些步驟?

首先,使用者的程式碼會被轉成未解析的邏輯計劃。未解析的意思是,儘管你的程式碼是合法的,但可能程式碼中引用的表或欄位名是不存在的。

接著,Spark會在分析器(analyzer)中使用catalog倉庫對程式碼中的表和列進行解析。catalog裡存放著所有表、DataFrame資訊。如果發現表或列不存在,分析器會拒絕掉這個未解析的邏輯計劃。

如果能成功解析,那麼解析後的邏輯計劃會被傳入Catalyst 優化器。然後根據一系列的優化規則來優化邏輯計劃,最後生成的是經過優化的邏輯計劃。

 

物理計劃Physical Planning

當成功建立了優化的邏輯計劃後,Spark就開始了物理計劃過程。

物理計劃也被叫做一個Spark計劃,指邏輯計劃如何在叢集上通過生成不同的物理執行策略和代價比較模型來選擇最佳的執行策略。

物理執行計劃會生成一系列的RDDs和變換。(這個過程類似於編譯,把DataFrame/Datasets/SQL程式設計的變換操作編譯成RDD的變換操作。)

 

執行Execution

當選擇了一個物理執行計劃後,Spark就開始在RDDs上跑程式碼了。

相關文章