首頁技術文章正文

Spark SQL架構的工作原理是什么?和Hive有什么不同?

更新時間:2021-03-23 來源:黑馬程序員 瀏覽量:

1577370495235_學IT就到黑馬程序員.gif


Spark SQL兼容Hive,這是因為Spark SQL架構與Hive底層結(jié)構相似,Spark SQL復用了Hive提供的元數(shù)據(jù)倉庫(Metastore)、HiveQL、用戶自定義函數(shù)(UDF)以及序列化和反序列工具(SerDes),下面通過圖1深入了解Spark SQL底層架構。

Spark SQL架構

圖1 Spark SQL架構

從圖1中可以看出,Spark SQL架構與Hive架構相比,除了把底層的MapReduce執(zhí)行引擎更改為Spark,還修改了Catalyst優(yōu)化器,Spark SQL快速的計算效率得益于Catalyst優(yōu)化器。從HiveQL被解析成語法抽象樹起,執(zhí)行計劃生成和優(yōu)化的工作全部交給Spark SQL的Catalyst優(yōu)化器進行負責和管理。

Catalyst優(yōu)化器是一個新的可擴展的查詢優(yōu)化器,它是基于Scala函數(shù)式編程結(jié)構,Spark SQL開發(fā)工程師設計可擴展架構主要是為了在今后的版本迭代時,能夠輕松地添加新的優(yōu)化技術和功能,尤其是為了解決大數(shù)據(jù)生產(chǎn)環(huán)境中遇到的問題(例如,針對半結(jié)構化數(shù)據(jù)和高級數(shù)據(jù)分析),另外,Spark作為開源項目,外部開發(fā)人員可以針對項目需求自行擴展Catalyst優(yōu)化器的功能。下面通過圖2描述Spark SQL的工作原理。

Spark SQL工作原理

圖2 Spark SQL工作原理

Spark要想很好地支持SQL,就需要完成解析(Parser)、優(yōu)化(Optimizer)、執(zhí)行(Execution)三大過程。Catalyst優(yōu)化器在執(zhí)行計劃生成和優(yōu)化的工作時候,它離不開自己內(nèi)部的五大組件,具體介紹如下所示。

Parse組件:該組件根據(jù)一定的語義規(guī)則(即第三方類庫ANTLR)將SparkSql字符串解析為一個抽象語法樹/AST。
Analyze組件:該組件會遍歷整個AST,并對AST上的每個節(jié)點進行數(shù)據(jù)類型的綁定以及函數(shù)綁定,然后根據(jù)元數(shù)據(jù)信息Catalog對數(shù)據(jù)表中的字段進行解析。
Optimizer組件:該組件是Catalyst的核心,主要分為RBO和CBO兩種優(yōu)化策略,其中RBO是基于規(guī)則優(yōu)化,CBO是基于代價優(yōu)化。SparkPlanner組件:優(yōu)化后的邏輯執(zhí)行計劃OptimizedLogicalPlan依然是邏輯的,并不能被Spark系統(tǒng)理解,此時需要將OptimizedLogicalPlan轉(zhuǎn)換成physical plan(物理計劃)。
CostModel組件:主要根據(jù)過去的性能統(tǒng)計數(shù)據(jù),選擇最佳的物理執(zhí)行計劃。

在了解了上述組件的作用后,下面分步驟講解Spark SQL工作流程。

1. 在解析SQL語句之前,會創(chuàng)建SparkSession,涉及到表名、字段名稱和字段類型的元數(shù)據(jù)都將保存在Catalog中;

2. 當調(diào)用SparkSession的sql()方法時就會使用SparkSqlParser進行解析SQL語句,解析過程中使用的ANTLR進行詞法解析和語法解析;

3. 接著使用Analyzer分析器綁定邏輯計劃,在該階段,Analyzer會使用Analyzer Rules,并結(jié)合Catalog,對未綁定的邏輯計劃進行解析,生成已綁定的邏輯計劃;

4. 然后Optimizer根據(jù)預先定義好的規(guī)則(RBO)對 Resolved Logical Plan 進行優(yōu)化并生成 Optimized Logical Plan(最優(yōu)邏輯計劃);

5. 接著使用SparkPlanner對優(yōu)化后的邏輯計劃進行轉(zhuǎn)換,生成多個可以執(zhí)行的物理計劃Physical Plan;

6. 接著CBO優(yōu)化策略會根據(jù)Cost Model算出每個Physical Plan的代價,并選取代價最小的 Physical Plan作為最終的Physical Plan;

7. 最終使用QueryExecution執(zhí)行物理計劃,此時則調(diào)用SparkPlan的execute()方法,返回RDD。




猜你喜歡:

數(shù)據(jù)處理中哪些場景可以使用Spark?

Spark SQL用法建議【大數(shù)據(jù)文章】

mysql5.5安裝教程:mysql下載與安裝

黑馬程序員大數(shù)據(jù)開發(fā)培訓班

分享到:
在線咨詢 我要報名
和我們在線交談!