Spark3 0新特性 SQL相關

2021-10-14 03:10:38 字數 2632 閱讀 6921

目錄

一、動態分割槽修剪(dynamic partition pruning)

二、自適應查詢執行(adaptive query execution)

三、對映下推(project pushdown)

四、謂詞下推(predicate pushdown)

靜態分割槽裁剪優化

過濾提前,減少無效資料讀寫,尤其在 join 時,效果很明顯

對比一下 spark 2.x

在 spark 2.x 裡面加了基於代價的優化,但是這個並不表現的很好。主要有以下幾個原因:

統計資訊的缺失;統計資訊過期;

很難抽象出乙個通用的 cost model。

為了解決這些問題,apache spark 3.0 引入了基於 runtime 的查詢優化。

第乙個就是動態分割槽裁減

比如上面的 sql 查詢,假設 t2 表 t2.id < 2 過濾出來的資料比較少,但是由於之前版本的 spark 無法進行動態計算代價,所以可能會導致 t1 表掃瞄出大量無效的資料。有了動態分割槽裁減,可以在執行的時候過濾掉 t1 表無用的資料

經過這個優化,查詢掃瞄的資料大大減少,效能提公升了 33 倍

而有了 aqe(自適應查詢執行) 之後,spark 就可以動態統計相關資訊,並動態調整執行計畫,比如把 sortmergejoin 變成 broadcasthashjoin:

spark.sql.optimizer.dynamicpartitionpruning.enabled 引數必須設定為 true,

說到列式儲存的優勢,對映下推是最突出的,它意味著在獲取表中原始資料時只需要掃瞄查詢中需要的列,由於每一列的所有值都是連續儲存的,所以分割槽取出每一列的所有值就可以實現tablescan運算元,而避免掃瞄整個表檔案內容。

在parquet中原生就支援對映下推,執行查詢的時候可以通過configuration傳遞需要讀取的列的資訊,這些列必須是schema的子集,對映每次會掃瞄乙個row group的資料,然後一次性得將該row group裡所有需要的列的cloumn chunk都讀取到記憶體中,每次讀取乙個row group的資料能夠大大降低隨機讀的次數,除此之外,parquet在讀取的時候會考慮列是否連續,如果某些需要的列是儲存位置是連續的,那麼一次讀操作就可以把多個列的資料讀取到記憶體。

在資料庫之類的查詢系統中最常用的優化手段就是謂詞下推了,通過將一些過濾條件盡可能的在最底層執行可以減少每一層互動的資料量,從而提公升效能,

例如」select count(1) from a join b on a.id = b.id where a.a > 10 and b.b < 100」sql查詢中,在處理join操作之前需要首先對a和b執行tablescan操作,然後再進行join,再執行過濾,最後計算聚合函式返回,但是如果把過濾條件a.a > 10和b.b < 100分別移到a表的tablescan和b表的tablescan的時候執行,可以大大降低join操作的輸入資料。

無論是行式儲存還是列式儲存,都可以在將過濾條件在讀取一條記錄之後執行以判斷該記錄是否需要返回給呼叫者,在parquet做了更進一步的優化,優化的方法時對每乙個row group的每乙個column chunk在儲存的時候都計算對應的統計資訊,包括該column chunk的最大值、最小值和空值個數。通過這些統計值和該列的過濾條件可以判斷該row group是否需要掃瞄。另外parquet還增加諸如bloom filter和index等優化資料,更加有效的完成謂詞下推。

在使用parquet的時候可以通過如下兩種策略提公升查詢效能:

1、類似於關聯式資料庫的主鍵,對需要頻繁過濾的列設定為有序的,這樣在匯入資料的時候會根據該列的順序儲存資料,這樣可以最大化的利用最大值、最小值實現謂詞下推。

2、減小行組大小和頁大小,這樣增加跳過整個行組的可能性,但是此時需要權衡由於壓縮和編碼效率下降帶來的i/o負載。

partitionfilter分割槽過濾:建立表的時候為分割槽表

大資料查詢優化 Spark3 0新特性

前言 apache spark在6月份分布了3.0.0版本,增加了許多效能優化方面的新特性。作為大資料分析的重要引擎,在sql查詢優化方面的新特性值得期待和使用。spark在sql查詢方面的效能優化主要分為四個方向七個方面 這7個方面最值得關注的在於動態優化方向的更新,下面來著重講一下。自適應查詢執...

Spark 3 0 對 GPU 做了什麼支援

spark 本身在資料處理流程裡佔據非常重要的地位,而在人工智慧的戰場,傳統 spark 能帶來什麼呢?在深度學習裡,模型訓練一般都被 tensorflow,pytorch 等深度學習框架占領了,而 spark 提供的 graphx 和 mllib 可以做一些機器學習的東西,但是在深度學習的戰場裡,...

大資料入門spark3 0入門到精通

第1節 00 了解 課程內容介紹 第2節 01 了解 spark發展歷史和特點介紹 第3節 02 掌握 spark環境搭建 local本地模式 第4節 03 掌握 spark環境搭建 standalone集群模式 第5節 04 掌握 spark環境搭建 standalone ha集群模式 第6節 0...