Spark SQL優(yōu)化策略
查詢優(yōu)化是傳統(tǒng)數(shù)據(jù)庫(kù)中最為重要的一環(huán),這項(xiàng)技術(shù)在傳統(tǒng)數(shù)據(jù)庫(kù)中已經(jīng)很成熟。除了查詢優(yōu)化,Spark SQL在存儲(chǔ)上也進(jìn)行了優(yōu)化。
下面介紹Spark SQL的一些優(yōu)化策略。
(1)內(nèi)存列式存儲(chǔ)與內(nèi)存緩存表
Spark SQL可以通過(guò)cacheTable將數(shù)據(jù)存儲(chǔ)轉(zhuǎn)換為列式存儲(chǔ),同時(shí)將數(shù)據(jù)加載到內(nèi)存緩存。cacheTable相當(dāng)于在分布式集群的內(nèi)存物化視圖,將數(shù)據(jù)緩存,這樣迭代的或者交互式的查詢不用再?gòu)腍DFS讀數(shù)據(jù),直接從內(nèi)存讀取數(shù)據(jù)大大減少了I/O開(kāi)銷。列式存儲(chǔ)的優(yōu)勢(shì)在于Spark SQL只需要讀出用戶需要的列,而不需要像行存儲(chǔ)那樣每次都將所有列讀出,從而大大減少內(nèi)存緩存數(shù)據(jù)量,更高效地利用內(nèi)存數(shù)據(jù)緩存,同時(shí)減少網(wǎng)絡(luò)傳輸和I/O開(kāi)銷。數(shù)據(jù)按照列式存儲(chǔ),由于是數(shù)據(jù)類型相同的數(shù)據(jù)連續(xù)存儲(chǔ),所以能夠利用序列化和壓縮減少內(nèi)存空間的占用。
(2)列存儲(chǔ)壓縮
為了減少內(nèi)存和硬盤空間占用,Spark SQL采用了一些壓縮策略對(duì)內(nèi)存列存儲(chǔ)數(shù)據(jù)進(jìn)行壓縮。Spark SQL的壓縮方式要比Shark豐富很多,如它支持PassThrough、RunLengthEncoding、DictionaryEncoding、BooleanBitSet、IntDelta、LongDelta等多種壓縮方式,這樣能夠大幅度減少內(nèi)存空間占用、網(wǎng)絡(luò)傳輸和I/O開(kāi)銷。
(3)邏輯查詢優(yōu)化
SparkSQL在邏輯查詢優(yōu)化(見(jiàn)圖8-4)上支持列剪枝、謂詞下壓、屬性合并等邏輯查詢優(yōu)化方法。列剪枝為了減少讀取不必要的屬性列、減少數(shù)據(jù)傳輸和計(jì)算開(kāi)銷,在查詢優(yōu)化器進(jìn)行轉(zhuǎn)換的過(guò)程中會(huì)優(yōu)化列剪枝。
下面介紹一個(gè)邏輯優(yōu)化的例子。
SELECT Class FROM (SELECT ID,Name,Class FROM STUDENT ) S WHERE S.ID=1
Catalyst將原有查詢通過(guò)謂詞下壓,將選擇操作ID=1優(yōu)先執(zhí)行,這樣過(guò)濾大部分?jǐn)?shù)據(jù),通過(guò)屬性合并將***的投影只做一次,最終保留Class屬性列。
(4)Join優(yōu)化
Spark SQL深度借鑒傳統(tǒng)數(shù)據(jù)庫(kù)的查詢優(yōu)化技術(shù)的精髓,同時(shí)在分布式環(huán)境下調(diào)整和創(chuàng)新特定的優(yōu)化策略?,F(xiàn)在Spark SQL對(duì)Join進(jìn)行了優(yōu)化,支持多種連接算法,現(xiàn)在的連接算法已經(jīng)比Shark豐富,而且很多原來(lái)Shark的元素也逐步遷移過(guò)來(lái),如BroadcastHashJoin、BroadcastNestedLoopJoin、HashJoin、LeftSemiJoin,等等。
下面介紹其中的一個(gè)Join算法。
BroadcastHashJoin將小表轉(zhuǎn)化為廣播變量進(jìn)行廣播,這樣避免Shuffle開(kāi)銷,***在分區(qū)內(nèi)做Hash連接。這里使用的就是Hive中Map Side Join的思想,同時(shí)使用DBMS中的Hash連接算法做連接。 隨著Spark SQL的發(fā)展,未來(lái)會(huì)有更多的查詢優(yōu)化策略加入進(jìn)來(lái),同時(shí)后續(xù)Spark SQL會(huì)支持像Shark Server一樣的服務(wù)端和JDBC接口,兼容更多的持久化層,如NoSQL、傳統(tǒng)的DBMS等。一個(gè)強(qiáng)有力的結(jié)構(gòu)化大數(shù)據(jù)查詢引擎正在崛起。
【本文為51CTO專欄作者“王森豐”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)注明出處】