Spark Sql 源碼剖析(三):Analyzer

當(dāng)一條 sql 語句被 SparkSqlParser 解析為一個(gè) unresolved logicalPlan 后乘碑,接下來就會(huì)使用 Analyzer 進(jìn)行 resolve宙攻。所謂的 resolve 也就是在未解析的 db、table、function癌淮、partition 等對(duì)應(yīng)的 node 上應(yīng)用一條條 Rule(規(guī)則)來替換為新的 node肚菠,應(yīng)用 Rule 的過程中往往會(huì)訪問 catalog 來獲取相應(yīng)的信息健蕊。

先來看看在解析過程中涉及到的幾個(gè)主要類菱阵,以便為之后的詳細(xì)分析做好鋪墊。

一缩功、主要類

上圖(省略了諸多成員晴及,方法)列舉了解析一個(gè) unresolved logicalPlan 時(shí)涉及的主要類及其之間的關(guān)系,其中 Analyzer 是解析的入口嫡锌,其定義如下:

class Analyzer(
    catalog: SessionCatalog,
    conf: SQLConf,
    maxIterations: Int)
  extends RuleExecutor[LogicalPlan] with CheckAnalysis

先來看看幾個(gè)主要的相關(guān)的類

1.1虑稼、SessionCatalog

SparkSession 使用的 catalog,是 spark 與底層 megastore(比如 Hive Metastore)的橋梁势木,并管理著 SparkSession 的臨時(shí)表傀广、view 以及函數(shù)翠订。由于會(huì)有并發(fā)訪問,該類是線程安全的。
如上圖中該類的構(gòu)造函數(shù)歼冰,該類借助 ExternalCatalog答憔、GlobalTempViewManager攘已、FunctionRegistry女蜈、FunctionResourceLoader 等類型的成員實(shí)現(xiàn)對(duì) db、table板驳、partition又跛、function 的 CURD 等功能

1.1.1、ExternalCatalog

catalog 接口若治,包含 functions慨蓝、partitions、tables 和 databases端幼。僅適用于非臨時(shí)的項(xiàng)目礼烈,線程安全。這是一個(gè)用來與外部系統(tǒng)交互的 external catalog(比如與 Hive Megastore 交互的實(shí)現(xiàn)是 HiveExternalCatalog静暂,你也可以實(shí)現(xiàn)自己的 meta store 及相應(yīng)的 ExternalCatalog)济丘。當(dāng) database 不存在的時(shí)候谱秽,要拋出 NoSuchDatabaseException洽蛀。主要包含以下幾類方法:

  • database 相關(guān):checkExists、create疟赊、alter郊供、list、drop近哟、alter驮审、use database
  • table 相關(guān):checkExists、create、alter疯淫、list地来、drop、alter schema熙掺、rename
  • partition 相關(guān):load(加載數(shù)據(jù)到一個(gè) partition)未斑、load 動(dòng)態(tài)分區(qū)、create币绩、drop蜡秽、rename、alter缆镣、get芽突、list
  • function 相關(guān):create、drop董瞻、alter寞蚌、rename、checkExists力细、list

1.1.2睬澡、GlobalTempViewManager

一個(gè)線程安全的全局的 temp views 的 manager,提供對(duì)其原子的操作眠蚂,比如 create煞聪、update、remove 等逝慧。注意昔脯,view 的名字是大小寫敏感的。其包含對(duì)于 temp view 的方法:

  • get
  • create
  • update
  • remove
  • rename
  • list
  • clear

1.1.3笛臣、FunctionRegistry

Analyzer 用來查找 UDF 的 catalog云稚,線程安全并且對(duì) db name 大小寫敏感。包含 function 相關(guān)的方法:

  • register
  • create or replace
  • look up
  • list
  • drop
  • checkExists
  • clear

1.1.4沈堡、FunctionResourceLoader

用來加載一個(gè)函數(shù)要使用的資源

1.2静陈、RuleExecutor

定義了一個(gè) rules 執(zhí)行框架,即怎么把一批批規(guī)則應(yīng)用在一個(gè) plan 上得到一個(gè)新的 plan诞丽。具體是怎么做的鲸拥,會(huì)在下面詳細(xì)展開。

1.3僧免、SQLConf

用來 get刑赶、set SQL 相關(guān)的配置、參數(shù)懂衩。其伴生 object 包含了 spark sql 的所有參數(shù)及其類型撞叨、說明金踪、默認(rèn)值。而 class SQLConf 提供了這些參數(shù)牵敷、配置的 getter胡岔、setter 方法。

1.4枷餐、CheckAnalysis

用于對(duì) plan 做一些解析姐军,如果解析失敗則拋出用戶層面的錯(cuò)誤

二、如何解析

整個(gè)解析過程就是 Analyzer 通過繼承或者包含實(shí)例的方式將這些類串起來尖淘,去 catalog 中查詢信息并應(yīng)用一系列規(guī)則來將一個(gè) unresolved logicalplan 最終轉(zhuǎn)變?yōu)橐粋€(gè)新的 resolved plan 的過程奕锌。

2.1、規(guī)則是如何執(zhí)行的村生?

2.1.1惊暴、Rule

在說明規(guī)則是如何執(zhí)行之前,先說明什么是規(guī)則趁桃?規(guī)則均繼承了 abstract class Rule辽话,包含了一個(gè) name 方法及 def apply(plan: TreeType): TreeType 方法,調(diào)用 apply 方法將一個(gè) plan 轉(zhuǎn)換成一個(gè)新的 plan卫病,這個(gè)新的 plan 往往與原來的 plan 有一些不同油啤,也有可能與執(zhí)行規(guī)則前相同。

2.1.2蟀苛、RuleExecutor

要把一個(gè) unresolved logicalPlan 解析為一個(gè) resolved logicalPlan益咬,需要執(zhí)行大量規(guī)則。那么帜平,這么多規(guī)則是如何組織的幽告?執(zhí)行順序是怎么樣的?這些問題都能在 RuleExecutor 類中找到答案裆甩。

2.1.2.1冗锁、Batch

類 RuleExecutor 看名字就知道是用來 execute rule 的。在其內(nèi)部定義了一個(gè) Batch 類嗤栓,用來表示 a batch of rules冻河,即一組同類的不定長規(guī)則:

case class Batch(name: String, 
                strategy: Strategy, 
                rules: Rule[TreeType]*)

其中,strategy: Strategy 即規(guī)則的執(zhí)行策略茉帅,表示 Batch 最大執(zhí)行次數(shù)叨叙。 如果執(zhí)行了 maxIterations 次之前達(dá)到收斂點(diǎn)(在這里是執(zhí)行規(guī)則后 plan 沒有變化),也將停止担敌,不再繼續(xù)執(zhí)行 Batch摔敛。而每個(gè) Batch 的 maxIterations 都是經(jīng)驗(yàn)值廷蓉。

RuleExecutor 包含了一個(gè) protected def batches: Seq[Batch] 方法全封,用來獲取一系列 Batch马昙,這些 Batch 都會(huì)在 execute 中執(zhí)行。所有繼承 RuleExecutor(Analyzer 和 Optimizer)都必須實(shí)現(xiàn)該方法刹悴,即提供自己的 Seq[Batch]行楞。如果需要新增規(guī)則,只需要新增 Batch 或者再某個(gè) Batch 中新增規(guī)則即可土匀。整體的框架不用動(dòng)子房。

2.1.2.2、RuleExecutor#execute

讓我們來看看 Batch 和 rule 具體是怎么執(zhí)行的就轧,即 RuleExecutor#execute(plan: TreeType): TreeType 的邏輯:

有幾個(gè)關(guān)鍵點(diǎn):

  • Batch 都是連續(xù)執(zhí)行的
  • Batch 中的 rules 也是連續(xù)執(zhí)行的
  • 當(dāng) Batch 執(zhí)行的次數(shù)達(dá)到其規(guī)定的最大執(zhí)行次數(shù)或執(zhí)行該 Batch 并未修改 plan证杭,則不再繼續(xù)運(yùn)行該 batch

三、Analyzer 的 Seq[Batch]

Analyzer 的 Seq[Batch] 如下:

lazy val batches: Seq[Batch] = Seq(
    Batch("Hints", fixedPoint,
      new ResolveHints.ResolveBroadcastHints(conf),
      ResolveHints.RemoveAllHints),
    Batch("Simple Sanity Check", Once,
      LookupFunctions),
    Batch("Substitution", fixedPoint,
      CTESubstitution,
      WindowsSubstitution,
      EliminateUnions,
      new SubstituteUnresolvedOrdinals(conf)),
    Batch("Resolution", fixedPoint,
      ResolveTableValuedFunctions ::
      ResolveRelations ::
      ResolveReferences ::
      ResolveCreateNamedStruct ::
      ResolveDeserializer ::
      ResolveNewInstance ::
      ResolveUpCast ::
      ResolveGroupingAnalytics ::
      ResolvePivot ::
      ResolveOrdinalInOrderByAndGroupBy ::
      ResolveAggAliasInGroupBy ::
      ResolveMissingReferences ::
      ExtractGenerator ::
      ResolveGenerate ::
      ResolveFunctions ::
      ResolveAliases ::
      ResolveSubquery ::
      ResolveSubqueryColumnAliases ::
      ResolveWindowOrder ::
      ResolveWindowFrame ::
      ResolveNaturalAndUsingJoin ::
      ExtractWindowExpressions ::
      GlobalAggregates ::
      ResolveAggregateFunctions ::
      TimeWindowing ::
      ResolveInlineTables(conf) ::
      ResolveTimeZone(conf) ::
      TypeCoercion.typeCoercionRules(conf) ++
      extendedResolutionRules : _*),
    Batch("Post-Hoc Resolution", Once, postHocResolutionRules: _*),
    Batch("View", Once,
      AliasViewChild(conf)),
    Batch("Nondeterministic", Once,
      PullOutNondeterministic),
    Batch("UDF", Once,
      HandleNullInputsForUDF),
    Batch("FixNullability", Once,
      FixNullability),
    Batch("Subquery", Once,
      UpdateOuterReferences),
    Batch("Cleanup", fixedPoint,
      CleanupAliases)
  )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妒御,一起剝皮案震驚了整個(gè)濱河市解愤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乎莉,老刑警劉巖送讲,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惋啃,居然都是意外死亡哼鬓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門边灭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來异希,“玉大人,你說我怎么就攤上這事绒瘦〕杌ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵椭坚,是天一觀的道長予跌。 經(jīng)常有香客問我,道長善茎,這世上最難降的妖魔是什么券册? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮垂涯,結(jié)果婚禮上烁焙,老公的妹妹穿的比我還像新娘。我一直安慰自己耕赘,他們只是感情好骄蝇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著操骡,像睡著了一般九火。 火紅的嫁衣襯著肌膚如雪赚窃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天岔激,我揣著相機(jī)與錄音勒极,去河邊找鬼。 笑死虑鼎,一個(gè)胖子當(dāng)著我的面吹牛辱匿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炫彩,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匾七,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了江兢?” 一聲冷哼從身側(cè)響起乐尊,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎划址,沒想到半個(gè)月后扔嵌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夺颤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年痢缎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片世澜。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡独旷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寥裂,到底是詐尸還是另有隱情嵌洼,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布封恰,位于F島的核電站麻养,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诺舔。R本人自食惡果不足惜鳖昌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望低飒。 院中可真熱鬧许昨,春花似錦、人聲如沸褥赊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拌喉。三九已至速那,卻和暖如春俐银,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琅坡。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留残家,地道東北人榆俺。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像坞淮,于是被迫代替她去往敵國和親茴晋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 數(shù)組是一種可變的回窘、可索引的數(shù)據(jù)集合诺擅。在Scala中用Array[T]的形式來表示Java中的數(shù)組形式 T[]。 v...
    時(shí)待吾閱讀 953評(píng)論 0 0
  • CatalystCatalyst是與Spark解耦的一個(gè)獨(dú)立庫啡直,是一個(gè)impl-free的執(zhí)行計(jì)劃的生成和優(yōu)化框架...
    Codlife閱讀 2,677評(píng)論 0 5
  • 1.HashMap是一個(gè)數(shù)組+鏈表/紅黑樹的結(jié)構(gòu)烁涌,數(shù)組的下標(biāo)在HashMap中稱為Bucket值,每個(gè)數(shù)組項(xiàng)對(duì)應(yīng)的...
    誰在烽煙彼岸閱讀 1,025評(píng)論 2 2
  • 最美的溫柔 你如明月嬌 我在風(fēng)中笑 夢(mèng)里依稀在今宵 最美的溫柔 你如清風(fēng)徐徐來 念卿化作雨 蓮花處處開 最美的溫柔...
    文山鹿閱讀 126評(píng)論 2 5
  • 世界是如此廣袤無垠酒觅,語文教學(xué)的領(lǐng)域更是如此撮执,一個(gè)人對(duì)它的認(rèn)識(shí)是那么微小,那么碎片舷丹,如果自以為自己的認(rèn)識(shí)就是全世...
    晚起畫蛾眉閱讀 113評(píng)論 0 0