spark基礎之spark sql執行原理和架構

happy19870612發表於2017-10-27

一 Spark SQL執行架構

Spark SQL對SQL語句的處理和關係型資料庫類似,即詞法/語法解析、繫結、優化、執行。Spark SQL會先將SQL語句解析成一棵樹,然後使用規則(Rule)對Tree進行繫結、優化等處理過程。Spark SQL由Core、Catalyst、Hive、Hive-ThriftServer四部分構成:

Core: 負責處理資料的輸入和輸出,如獲取資料,查詢結果輸出成DataFrame等

Catalyst: 負責處理整個查詢過程,包括解析、繫結、優化等

Hive: 負責對Hive資料進行處理

Hive-ThriftServer: 主要用於對hive的訪問

1.1 TreeNode

邏輯計劃、表示式等都可以用tree來表示,它只是在記憶體中維護,並不會進行磁碟的持久化,分析器和優化器對樹的修改只是替換已有節點。

TreeNode有2個直接子類,QueryPlan和Expression。QueryPlam下又有LogicalPlan和SparkPlan. Expression是表示式體系,不需要執行引擎計算而是可以直接處理或者計算的節點,包括投影操作,操作符運算等

1.2 Rule & RuleExecutor

Rule就是指對邏輯計劃要應用的規則,以到達繫結和優化。他的實現類就是RuleExecutor。優化器和分析器都需要繼承RuleExecutor。每一個子類中都會定義Batch、Once、FixPoint. 其中每一個Batch代表著一套規則,Once表示對樹進行一次操作,FixPoint表示對樹進行多次的迭代操作。RuleExecutor內部提供一個Seq[Batch]屬性,裡面定義的是RuleExecutor的處理邏輯,具體的處理邏輯由具體的Rule子類實現。


整個流程架構圖:



二 Spark SQL執行原理

2.1 使用SessionCatalog儲存後設資料

在解析SQL語句之前,會建立SparkSession,或者如果是2.0之前的版本初始化SQLContext,SparkSession只是封裝了SparkContext和SQLContext的建立而已。會把後設資料儲存在SessionCatalog中,涉及到表名,欄位名稱和欄位型別。建立臨時表或者檢視,其實就會往SessionCatalog註冊

2.2 解析SQL,使用ANTLR生成未繫結的邏輯計劃

當呼叫SparkSession的sql或者SQLContext的sql方法,我們以2.0為準,就會使用SparkSqlParser進行解析SQL. 使用的ANTLR進行詞法解析和語法解析。它分為2個步驟來生成Unresolved LogicalPlan:

# 詞法分析:Lexical Analysis,負責將token分組成符號類

# 構建一個分析樹或者語法樹AST

 

 

2.3 使用分析器Analyzer繫結邏輯計劃

在該階段,Analyzer會使用Analyzer Rules,並結合SessionCatalog,對未繫結的邏輯計劃進行解析,生成已繫結的邏輯計劃。

 

2.4 使用優化器Optimizer優化邏輯計劃

優化器也是會定義一套Rules,利用這些Rule對邏輯計劃和Exepression進行迭代處理,從而使得樹的節點進行和並和優化

 

2.5 使用SparkPlanner生成物理計劃

SparkSpanner使用Planning Strategies,對優化後的邏輯計劃進行轉換,生成可以執行的物理計劃SparkPlan.

 

2.6 使用QueryExecution執行物理計劃

此時呼叫SparkPlan的execute方法,底層其實已經再觸發JOB了,然後返回RDD


相關文章