更新時(shí)間:2021-03-23 來源:黑馬程序員 瀏覽量:
Spark SQL兼容Hive,這是因?yàn)镾park SQL架構(gòu)與Hive底層結(jié)構(gòu)相似,Spark SQL復(fù)用了Hive提供的元數(shù)據(jù)倉庫(Metastore)、HiveQL、用戶自定義函數(shù)(UDF)以及序列化和反序列工具(SerDes),下面通過圖1深入了解Spark SQL底層架構(gòu)。
圖1 Spark SQL架構(gòu)
從圖1中可以看出,Spark SQL架構(gòu)與Hive架構(gòu)相比,除了把底層的MapReduce執(zhí)行引擎更改為Spark,還修改了Catalyst優(yōu)化器,Spark SQL快速的計(jì)算效率得益于Catalyst優(yōu)化器。從HiveQL被解析成語法抽象樹起,執(zhí)行計(jì)劃生成和優(yōu)化的工作全部交給Spark SQL的Catalyst優(yōu)化器進(jìn)行負(fù)責(zé)和管理。
Catalyst優(yōu)化器是一個(gè)新的可擴(kuò)展的查詢優(yōu)化器,它是基于Scala函數(shù)式編程結(jié)構(gòu),Spark SQL開發(fā)工程師設(shè)計(jì)可擴(kuò)展架構(gòu)主要是為了在今后的版本迭代時(shí),能夠輕松地添加新的優(yōu)化技術(shù)和功能,尤其是為了解決大數(shù)據(jù)生產(chǎn)環(huán)境中遇到的問題(例如,針對(duì)半結(jié)構(gòu)化數(shù)據(jù)和高級(jí)數(shù)據(jù)分析),另外,Spark作為開源項(xiàng)目,外部開發(fā)人員可以針對(duì)項(xiàng)目需求自行擴(kuò)展Catalyst優(yōu)化器的功能。下面通過圖2描述Spark SQL的工作原理。
圖2 Spark SQL工作原理
Spark要想很好地支持SQL,就需要完成解析(Parser)、優(yōu)化(Optimizer)、執(zhí)行(Execution)三大過程。Catalyst優(yōu)化器在執(zhí)行計(jì)劃生成和優(yōu)化的工作時(shí)候,它離不開自己內(nèi)部的五大組件,具體介紹如下所示。
Parse組件:該組件根據(jù)一定的語義規(guī)則(即第三方類庫ANTLR)將SparkSql字符串解析為一個(gè)抽象語法樹/AST。
Analyze組件:該組件會(huì)遍歷整個(gè)AST,并對(duì)AST上的每個(gè)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)類型的綁定以及函數(shù)綁定,然后根據(jù)元數(shù)據(jù)信息Catalog對(duì)數(shù)據(jù)表中的字段進(jìn)行解析。
Optimizer組件:該組件是Catalyst的核心,主要分為RBO和CBO兩種優(yōu)化策略,其中RBO是基于規(guī)則優(yōu)化,CBO是基于代價(jià)優(yōu)化。SparkPlanner組件:優(yōu)化后的邏輯執(zhí)行計(jì)劃OptimizedLogicalPlan依然是邏輯的,并不能被Spark系統(tǒng)理解,此時(shí)需要將OptimizedLogicalPlan轉(zhuǎn)換成physical plan(物理計(jì)劃)。
CostModel組件:主要根據(jù)過去的性能統(tǒng)計(jì)數(shù)據(jù),選擇最佳的物理執(zhí)行計(jì)劃。
在了解了上述組件的作用后,下面分步驟講解Spark SQL工作流程。
1. 在解析SQL語句之前,會(huì)創(chuàng)建SparkSession,涉及到表名、字段名稱和字段類型的元數(shù)據(jù)都將保存在Catalog中;
2. 當(dāng)調(diào)用SparkSession的sql()方法時(shí)就會(huì)使用SparkSqlParser進(jìn)行解析SQL語句,解析過程中使用的ANTLR進(jìn)行詞法解析和語法解析;
3. 接著使用Analyzer分析器綁定邏輯計(jì)劃,在該階段,Analyzer會(huì)使用Analyzer Rules,并結(jié)合Catalog,對(duì)未綁定的邏輯計(jì)劃進(jìn)行解析,生成已綁定的邏輯計(jì)劃;
4. 然后Optimizer根據(jù)預(yù)先定義好的規(guī)則(RBO)對(duì) Resolved Logical Plan 進(jìn)行優(yōu)化并生成 Optimized Logical Plan(最優(yōu)邏輯計(jì)劃);
5. 接著使用SparkPlanner對(duì)優(yōu)化后的邏輯計(jì)劃進(jìn)行轉(zhuǎn)換,生成多個(gè)可以執(zhí)行的物理計(jì)劃Physical Plan;
6. 接著CBO優(yōu)化策略會(huì)根據(jù)Cost Model算出每個(gè)Physical Plan的代價(jià),并選取代價(jià)最小的 Physical Plan作為最終的Physical Plan;
7. 最終使用QueryExecution執(zhí)行物理計(jì)劃,此時(shí)則調(diào)用SparkPlan的execute()方法,返回RDD。
猜你喜歡: