天天看點

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

嘉賓:範文臣

Databricks 開源組技術主管,Apache Spark Committer、PMC成員,Spark開源社群核心開發之一。

視訊位址:

https://developer.aliyun.com/live/245461

正文:

Databricks最新開發的一款基于Spark的高性能向量化查詢引擎——Delta,是基于ApacheSpark 3.0建構、完全相容Spark API,并且能夠通過以下方式加快SQL和DataFrame工作負載:

1、改進的查詢優化器

2、本機矢量化執行引擎

3、緩存

一、優化器

優化器是基于Spark的CPU和實時運作動态優化打造的。Databricks内部利用更加進階的統計資訊來提升性能,例如star schema workload可以達到最高18倍的性能提升。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

二、緩存層

緩存層可以自動幫使用者緩存積累的資料,它是基于MVMe SSDs打造的,可以把資料轉化成記憶體優化的格式放在SSD中,然後可以更快的加速CPU性能,這個特點可以讓workload有5倍性能提升。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

三、本地化執行引擎

Databricks近幾年一直在緻力于提升引擎性能,要達到這樣的目的,可以從兩個層面來看。

第一是硬體趨勢,這是做性能優化的基礎;第二是使用者場景,這是性能優化的目标,有效的性能優化是可以給客戶帶來收益的。

第一、硬體趨勢

2015年基于Spark Summit調研顯示(如下圖),2010年硬體的基本情況是存

50+MB/s(HDD),網絡是1Gpbs,CPU是~3GHz;五年後,存儲和網絡都有了10倍以上的提升,但是CPU卻并沒有什麼變化。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

基于這樣的調研結果,Databricks推出了鎢絲計劃,目标就是讓引擎加速CPU,充分調動CPU性能。CPU有自己的緩存,CPU通路緩存和記憶體中間有巨大的性能鴻溝,是以充分調動CPU性能就是,如何設定資料結構讓記憶體資料進到CUP緩存更加高效。要達到這樣的目的,可以讓代碼生成得更加精簡。另外一個方法就是以do one來降低局勢的消耗。

2020年,硬體的變化讓io性能有了進一步提升。SSD有了NVMe接口,同時有了超高速網絡,但CPU仍然是3赫茲。那麼當下我們的挑戰是在這樣的硬體條件下,如何最大化CPU性能。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

第二、使用者場景趨勢

當下企業越來越強調靈活性,業務需要适用市場變化而不停的變化。在這種使用者場景下,資料模型就沒有精力和時間去仔細打磨,往往會造成剛剛設計好的資料模型,因為業務的變化而全部推翻了。同時,資料限制也沒有設定,更為靈活的字元串類型受到追捧。

在這種情況下,當資料越來越多,中間還夾雜着半結構化和非結構化,如何在保證靈活性的前提下提升性能呢?Photon,即本地化執行引擎,就是解決上面問題的産品。

Photon是Datastricks用C++寫的引擎,利用了向量化技術在技術層面和指令層面實作向量化;也會針對使用者的靈活需求,在半結構化和非結構化的前提下對資料做優化。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

如何用CPU資料并行的特性改寫執行引擎?

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

首先如下圖所示,列式存儲更高效,它的優勢是:其一因為每一列的資料式一個類型,可以直接被壓縮為存儲;其次記憶體通路順序是線性的,這樣CPU就可以預估即将要通路的資料并提前加載到緩存裡,進而達到提升性能目的。

另外當對不同列進行操作時候,所使用的簡單的代碼也更容易被反編譯為機器碼,也就是可以用CPU特性去執行代碼。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

如何利用指令并行改寫執行引擎?

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

Hash Table是一個在SQL引擎中非常重要的資料結構。如下圖舉例,假設有group by這樣的query,它是怎麼實作的呢?首先建構一個Hash Table,然後用for循環去通路資料,并對每個資料算出Hash值,并确定在Hash Table的哪個位置存資料。然後比較資料是否正确,如果沒問題就可以加起來。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

上圖簡單的代碼瓶頸在綠色部分,即通路數組。因為每個資料的Hash值是随機的,每次算出來都不一樣,這種通路方式是非常低效的。其實在這期間大部分CPU的時間都在等待資料從記憶體進到CPU緩存,這個轉換時間占了2/3,這對于Group by的操作是非常浪費的事情。

基于這樣的情況,如何優化呢?

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

由上圖可以看出,這段代碼分做了四件事情。第一是算Hash值,第二是通路記憶體拿到Key,第三是把Key做比較,第四是做加法。最慢的是通路Key,而且整個循環體也非常大,會導緻CPU比較難優化。基于這種情況,實作優化的方法就是可以将循環變得簡單些。

如下圖可以将一個循環拆成3個循環,反而能夠讓這個過程變得更快。原因是,将上文提到的綠色代碼瓶頸做成一個循環,就可以完成CPU的優化。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

上述簡單的操作完成後,記憶體診斷時間可以降低1/4,同時記憶體時間也降低了。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

這樣調整後,通過測試可以發現系統優化後整體性能可以提升3倍。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

關于如何優化結構化和半結構化資料,主要展開介紹下如何針對String類型優化。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

第一個方法是用C++将自定義函數全部重寫一遍,性能可以提高1-2兩倍,但是這樣的提升不大;

在将第二個方法前,先介紹一下背景知識。當下主流的字元串是編碼格式,這種編碼格式的特點是變長,比如字母是一個字元,中文是三個字元。這樣的編碼方式不浪費空間,空間利用高效,但是計算比較低效。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

假設使用者資料中大部分是英文字元,摻雜着中文字元或其他字元,這種場景如何優化呢?可以将String優化分為兩步。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

第一步,确認String是不是ASCII編碼;通過String優化後,可以達到60GB/s/核的處理性能。

第二步,如果不是ASCII編碼,那麼可以按照C++編碼格式一個個處理。

通過以上的處理,性能提升會非常明顯。

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結
大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

總結

 Photon是用本地語言寫的向量化執行引擎,它主要利用了資料向量化技術;并且能夠針對使用者靈活需求做業務場景優化;

 Engine産品結果主要包括優化基層、存儲緩存層和本地化執行層;其中本地化執行層還在内測階段,使用者需要跟銷售聯系才能拿到内測資格,其他資源都是公開的,可以通過阿裡雲擷取,在阿裡雲上叫DDI(阿裡雲批流一體大資料分析引擎)

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結

關于Databricks

Databricks是屬于 Spark 的商業化公司,由美國伯克利大學 AMP 實驗室的 Spark 大資料處理系統多位創始人聯合創立。Databricks 緻力于提供基于 Spark 的雲服務,可用于資料內建和資料管道等任務。

歡迎交流

對阿裡雲E-MapReduce感興趣的朋友可以申請加群交流,加入釘釘群(如下)@揚流

大資料和AI | 基于Spark的高性能向量化查詢引擎一、優化器二、緩存層三、本地化執行引擎總結