傳統關系型數據庫中 ,最基本的sql查詢語句由projecttion (field a,field b,field c) , datasource (table A) 和 fieter (field a >10) 三部分組成。 分別對應了sql查詢過程中的result , datasource和operation ,也就是按照result ——> datasource ——> operation 的順序來描述,如下圖所示:
但是sql實際執行過程是按照operation——> datasource——>result 的順序來執行的這與sql語法正好相反,具體的執行過程如下:
1 . 語法和詞法解析:對寫入的sql語句進行詞法和語法解析(parse),分辨出sql語句在哪些是關鍵詞(如select ,from 和where),哪些是表達式,哪些是projection ,哪些是datasource等,判斷SQL語法是否規范,並形成邏輯計划。
2 .綁定:將SQL語句和數據庫的數據字典(列,表,視圖等)進行綁定(bind),如果相關的projection和datasource等都在的話,則表示這個SQL語句是可以執行的。
3 .優化(optimize):一般的數據庫會提供幾個執行計划,這些計划一般都有運行統計數據,數據庫會在這些計划中選擇一個最優計划。
4 .執行(execute):執行前面的步驟獲取最有執行計划,返回查詢的數據集。
SparkSQL的運行架構:
Spark SQL對SQL語句的處理和關系型數據庫采用了類似的方法,sparksql先會將SQL語句進行解析(parse)形成一個Tree,然后使用Rule對Tree進行綁定,優化等處理過程,通過模式匹配對不同類型的節點采用不同操作。而sparksql的查詢優化器是catalyst,它負責處理查詢語句的解析,綁定,優化和生成物理執行計划等過程,catalyst是sparksql最核心部分。
Spark SQL由core,catalyst,hive和hive-thriftserver4個部分組成。
- core: 負責處理數據的輸入/輸出,從不同的數據源獲取數據(如RDD,Parquet文件和JSON文件等),然后將結果查詢結果輸出成Data Frame。
- catalyst: 負責處理查詢語句的整個處理過程,包括解析,綁定,優化,生成物理計划等。
- hive: 負責對hive數據的處理。
- hive-thriftserver:提供client和JDBC/ODBC等接口。
運行原理原理分析:
1.使用SesstionCatalog保存元數據
在解析sql語句前需要初始化sqlcontext,它定義sparksql上下文,在輸入sql語句前會加載SesstionCatalog,初始化sqlcontext時會把元數據保存在SesstionCatalog中,包括庫名,表名,字段,字段類型等。這些數據將在解析未綁定的邏輯計划上使用。
2.使用Antlr生成未綁定的邏輯計划
Spark2.0版本起使用Antlr進行詞法和語法解析,Antlr會構建一個按照關鍵字生成的語法樹,也就是生成的未綁定的邏輯計划。
3.使用Analyzer綁定邏輯計划
在這個階段Analyzer 使用Analysis Rules,結合SessionCatalog元數據,對未綁定的邏輯計划進行解析,生成已綁定的邏輯計划。
4.使用Optimizer優化邏輯計划
Opetimize(優化器)的實現和處理方式同Analyzer類似,在該類中定義一系列Rule,利用這些Rule對邏輯計划和Expression進行迭代處理,達到樹的節點的合並和優化。
5.使用SparkPlanner生成可執行計划的物理計划
SparkPlanner使用Planning Strategies對優化的邏輯計划進行轉化,生成可執行的物理計划。
6.使用QueryExecution執行物理計划