Spark SQL基本原理
1、Spark SQL模塊划分
2、Spark SQL架構--catalyst設計圖
3、Spark SQL運行架構
4、Hive兼容性
1、Spark SQL模塊划分
Spark SQL模塊划分為Core、caralyst、hive和hive- ThriftServer四大模塊。
Spark SQL依然是讀取數據進去,然后你可以執行sql操作,然后你還可以執行其他的結構化操作,不光僅僅是只能sql操作哈!這一點,很多人都沒理解到位。
也有數據的輸入和輸出的工作。
比如,Spark SQL模塊里的core模塊,就是為了處理數據的輸入輸出。將查詢結果輸出成DataFrame。具體見上圖。
Spark SQL模塊里的catalyst模塊。具體見上圖。
Spark SQL模塊里的hive模塊,對hive數據的處理。具體見上圖。
Spark SQL模塊里的hive -ThriftServer模塊,具體見上圖。
2、Spark SQL架構--catalyst設計圖(這里說Spark SQL模塊里的catalyst模塊!!)
注意:圖中的虛線部分是現在未實現或實現不完善的。
其中虛線部分是以后版本要實現的功能,實線部分是已經實現的功能。從上圖看,catalyst主要的實現組件有:
sqlParse,完成sql語句的語法解析功能,目前只提供了一個簡單的sql解析器;
Analyzer,主要完成綁定工作,將不同來源的Unresolved LogicalPlan和元數據(如hive metastore、Schema catalog)進行綁定,生成resolved LogicalPlan;
optimizer,對resolvedLogicalPlan進行優化,生成optimizedLogicalPlan(OptimizationRules,對resolvedLogicalPlan進行合並、列裁剪、過濾器下推等優化作業而轉換成optimized LogicalPlan);
Planner,將LogicalPlan轉換成PhysicalPlan;
CostModel,主要根據過去的性能統計數據,選擇最佳的物理執行計划。
3、Spark SQL運行架構
類似於關系型數據庫,SparkSQL也是語句也是由Projection(a1,a2,a3)、DataSource(tableA)、Filter(condition)組成,分別對應sql查詢過程中的Result、Data Source、Operation,也就是說SQL語句按Result-->Data Source-->Operation的次序來描述的。
執行SparkSQL語句順序為:
1.對讀入的SQL語句進行解析(Parse),分辨出SQL語句中哪些詞是關鍵詞(如SELECT、FROM、WHERE),哪些是表達式、哪些是Projection、哪些是Data Source等,從而判斷SQL語句是否規范;
2.將SQL語句和數據庫的數據字典(列、表、視圖等等)進行綁定(Bind),如果相關的Projection、DataSource等都是存在的話,就表示這個SQL語句是可以執行的;
3.一般的數據庫會提供幾個執行計划,這些計划一般都有運行統計數據,數據庫會在這些計划中選擇一個最優計划(Optimize);
4.計划執行(Execute),按Operation-->DataSource-->Result的次序來進行的,在執行過程有時候甚至不需要讀取物理表就可以返回結果,比如重新運行剛運行過的SQL語句,可能直接從數據庫的緩沖池中獲取返回結果。
4、Hive兼容性
支持使用hql來寫查詢語句
兼容metastore
使用Hive的SerDes
對UDFs, UDAFs, UDTFs作了封裝。