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