第7章 Spark SQL 的運行原理(了解)
7.1 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的訪問
7.1.1 TreeNode
邏輯計划、表達式等都可以用tree來表示,它只是在內存中維護,並不會進行磁盤的持久化,分析器和優化器對樹的修改只是替換已有節點。
TreeNode有2個直接子類,QueryPlan和Expression。QueryPlam下又有LogicalPlan和SparkPlan. Expression是表達式體系,不需要執行引擎計算而是可以直接處理或者計算的節點,包括投影操作,操作符運算
7.1.2 Rule & RuleExecutor
Rule就是指對邏輯計划要應用的規則,以到達綁定和優化。他的實現類就是RuleExecutor。優化器和分析器都需要繼承RuleExecutor。每一個子類中都會定義Batch、Once、FixPoint. 其中每一個Batch代表着一套規則,Once表示對樹進行一次操作,FixPoint表示對樹進行多次的迭代操作。RuleExecutor內部提供一個Seq[Batch]屬性,里面定義的是RuleExecutor的處理邏輯,具體的處理邏輯由具體的Rule子類實現。
整個流程架構圖:
7.2 Spark SQL運行原理
7.2.1 使用SessionCatalog保存元數據
在解析SQL語句之前,會創建SparkSession,或者如果是2.0之前的版本初始化SQLContext,SparkSession只是封裝了SparkContext和SQLContext的創建而已。會把元數據保存在SessionCatalog中,涉及到表名,字段名稱和字段類型。創建臨時表或者視圖,其實就會往SessionCatalog注冊
7.2.2 解析SQL,使用ANTLR生成未綁定的邏輯計划
當調用SparkSession的sql或者SQLContext的sql方法,我們以2.0為准,就會使用SparkSqlParser進行解析SQL. 使用的ANTLR進行詞法解析和語法解析。它分為2個步驟來生成Unresolved LogicalPlan:
# 詞法分析:Lexical Analysis,負責將token分組成符號類
# 構建一個分析樹或者語法樹AST
7.2.3 使用分析器Analyzer綁定邏輯計划
在該階段,Analyzer會使用Analyzer Rules,並結合SessionCatalog,對未綁定的邏輯計划進行解析,生成已綁定的邏輯計划。
7.2.3 使用優化器Optimizer優化邏輯計划
優化器也是會定義一套Rules,利用這些Rule對邏輯計划和Exepression進行迭代處理,從而使得樹的節點進行和並和優化
7.2.4 使用SparkPlanner生成物理計划
SparkSpanner使用Planning Strategies,對優化后的邏輯計划進行轉換,生成可以執行的物理計划SparkPlan.
7.2.5 使用QueryExecution執行物理計划
此時調用SparkPlan的execute方法,底層其實已經再觸發JOB了,然后返回RDD