天天看點

深入了解 Spark Sql

最近想來,大資料相關技術與傳統型資料庫技術很多都是互相融合、互相借鑒的。傳統型資料庫強勢在于其久經考驗的sql優化器經驗,弱勢在于分布式領域的高可用性、容錯性、擴充性等,假以時日,讓其經過一定的改造,比如引入Paxos、raft等,強化自己在分布式領域的能力,相信一定會在大資料系統中占有一席之地。相反,大資料相關技術優勢在于其天生的擴充性、可用性、容錯性等,但其sql優化器經驗卻基本全部來自于傳統型資料庫,當然,針對列式存儲大資料sql優化器會有一定的優化政策。

spark sql 設計架構大緻可以分為 3 層

api 層,sql + dataframe + dataset,通過 api 接收 sql 語句,

計劃層,Catalyst 優化器,解析 sql 生成執行計劃

執行層,rdd、dag 實體計劃 + rm 、scheduler + tungsten 底層優化,生成 rdd 組成的 dag 執行計劃交由叢集執行

Catalyst 主要是計劃層做優化,其運作原理是分為四步, 先對 sql 或者 Dataset 的代碼解析, 生成邏輯計劃, 後對邏輯計劃進行優化, 再生成實體計劃, 最後生成代碼到叢集中以 RDD 的形式運作。

parser 解析器 :解析 sql,生成抽象文法樹(AST);

analyser 分析器 :在 AST 中加入中繼資料資訊, 即資料類型綁定以及函數綁定;

logical optimization 邏輯優化 :對已經加入中繼資料的 AST, 輸入優化器進行優化,比如,謂詞下推、列值裁剪、固定精度、常量累加、Limits合并;

physical planning 實體計劃 :`成本模型`對整棵樹再次執行優化, 選擇一個更好的計劃;

code generation 代碼生成 :quasiquotes 允許用 scala 語言程式設計建構抽象文法樹(AST),然後可以在運作時将其提供給scala編譯器以生成位元組碼。

- 備注 :可以使用 queryExecution 方法檢視邏輯執行計劃, 使用 explain 方法檢視實體執行計劃,也可以使用 spark WebUI 在 sql 标簽下檢視這兩個計劃

AST

Catalyst 的主要資料類型就是有節點對象組成的樹。每個node都有一個node類型和零個或者多個子節點。scala中新定義的node類型是TreeNode類的子類。這些對象都是不可改變的,可以使用函數轉換來操作。

舉一個簡單的例子,針對一個非常簡單的expression我們總共有下面三種node類型:

A),Literal(value: Int): 一個常量

B),Attribute(name: String):輸入行的一個列屬性,例如:“x”

C),Add(left: TreeNode, right: TreeNode):兩個expressions求加

這些類可以用來建構一棵樹。舉例,x+(1+2),這個表達式,在scala代碼中就如下:

Add(Attribute(x), Add(Literal(1), Literal(2)))

analyzer

analyzer 周遊整個AST,對樹上的每個節點進行資料類型綁定以及函數綁定,比如people詞素會根據中繼資料表資訊解析為包含age、id以及name三列的表,people.age會被解析為資料類型為int的變量,sum會被解析為特定的聚合函數,

optimization

邏輯優化是使用規則來操縱樹,這些規則是從一顆樹到另一棵樹的轉換函數。雖然一個規則可以在其輸入樹上運作任意代碼(給定這個樹隻是一個scala對象),但最常見的方法是使用一組模式比對函數來查找和替換子樹為特定結構。模式比對是許多函數程式設計語言的特征,允許從代數資料類型的潛在嵌套結構中提取值。在Catalyst中,文法樹提供了一種轉換方法,可以在樹的所有節點上遞歸地應用模式比對函數,将比對到的節點轉換為特定結果。

planning

在實體計劃層,spark sql會擷取一個邏輯計劃,用實體操作算子産生一個或者多個實體計劃。然後用cost模型選擇一個實體計劃。目前基于cost-based的優化僅僅用于選擇join算法:對已知的很小的relations,spark sql會選擇使用spark的提供的點對點的廣播功能實作Broadcast join。該架構支援更廣泛地使用cost-based的優化,然而,由于可以使用規則為整個樹遞歸地估計成本。是以,我們打算在未來實作更加豐富的cost-based優化。

實體計劃還可以執行基于規則的實體優化,比如将列裁剪和過濾操在一個spark的Map算子中以pipeline方式執行。此外,它可以将邏輯計劃的操作下推到支援謂詞或projection 下推的資料源。

在實體計劃層,Catalyst也許會産生多個實體計劃,然後根據cost進行選擇。其它,層都是單純的基于規則的優化。每個層使用不同的樹節點類型。Catalyst 擁有的節點庫包括表達式(expressions),資料類型(data types),邏輯和實體操作(logical and physical operators)。

Catalyst 啟蒙篇

http://hbasefly.com/2017/03/01/sparksql-catalyst/?sofqze=clzgb1&juneng=r8eoa1

圖表抽象表達清晰的 spark sql Catalyst 優化器

https://blog.csdn.net/qq_18800463/article/details/101194101

https://www.jianshu.com/p/410c23efb565

spark sql 優化器 Catalyst 綜述性文章,後者包括 spark sql 的源碼連結

https://cloud.tencent.com/developer/article/1032529

https://juejin.im/entry/5b3b202ce51d45191c7e10b5

spark sql 自定義優化器的實作, cost 模型的詳細步驟

https://my.oschina.net/freelili/blog/3001238

繼續閱讀