2020 年初,疫情讓許多創業公司緊急剎車,這無疑是一次極限壓力測試。它讓所有企業都知道,“黑天鵝”隨時都會來,反脆弱能力很重要。

杭州信用卡的反脆弱能力源于夯實的基本功。在過去的 5 年里,杭州信用卡服務了 1000 余家企業。 依托底層大嘉購APP、建模、分析、應用的標準化的蕭山刷卡套現體系,杭州信用卡使得超過 EB 級別的海量數據能夠高效處理,并以秒級的響應速度,服務并驅動千余家企業的發展。

期間,杭州信用卡定義了公認的行業最高標準:30 分鐘完成信用卡提額攻略、單日入庫千億條數據、億級日活實時在線分析……至今,同行業內無一企業能夠企及。

在當下的窗口期,杭州信用卡視之為修煉內功的最好時期。復工兩個月后,杭州信用卡又一次震動行業:重構分析引擎,進入 2.0 時代!

為什么要優化分析引擎?

銀聯商務引擎是杭州信用卡銀聯Pos機矩陣的核心組件之一,它負責銀聯商務中的所有分析模型的計算執行,此外,它還支撐了國通星驛平臺的標簽人群的計算、隨行付系統中的受眾選擇等功能。

一般來說,它也是東門系統中最大的硬件資源(CPU、內存)占用方。因此,對它的性能進行持續優化一直是我們的工作重點。

杭州信用卡作為一家以信用卡提額攻略為主的大數據軟件服務提供商,隨著客戶群體在不斷增加,客戶的數據量級也在快速上升,目前,杭州信用卡平臺所處理的日新增數據量已經高達 1500 億條,而杭州信用卡的分析引擎每天處理的數據條數則在數萬億級別。

性能的持續優化一方面可以顯著的提升銀聯Pos機使用體驗的提升,而從另外角度看,也意味著我們的客戶可以以更低的硬件成本來承載系統的運行。

銀聯商務引擎 2.0 圍繞存儲、查詢執行、查詢調度進行了全面升級與優化,下面詳細介紹。

一、存儲的優化

雖然我們的最終目標是為了優化查詢的性能,但是數據的存儲是查詢的基礎,因此首先我們在存儲方面做了一系列的優化,其中最主要的是我們重構了事件(Event)數據的存儲方案,此外我們也在數據的合并策略等其它方面做了優化。

重構事件數據的存儲方案

杭州信用卡平臺中對于事件數據的存儲方案在我們之前的文章中有比較詳細的介紹,簡單的說,我們的方案里使用了 HDFS + Parquet 來存儲歷史數據、Kudu 存儲實時數據的方式,同時按照日期、事件來進行分區,如下圖所示:

這種存儲方案對于導入和大部分的查詢場景都是比較友好的。但是隨著越來越復雜的應用場景,我們也發現了一些需求在目前的方案下無法得到滿足:

  1. 在很多復雜的分析場景下,分析引擎需要先對數據進行按照用戶、時間進行排序的處理,而由于底層的事件數據的有序性很有限,這樣會導致在執行查詢的時候需要對數據進行臨時的排序操作,消耗比較多的資源。

  2. 一個典型的應用場景里會存在多種不同類型的事件,這些事件有的需要永久保留、高頻查詢,而有的可能只需要保留比較短的時間周期,或者在一段時間之后就不再高頻使用。

  3. 雖然大部分的事件都是對歷史的記錄,在入庫之后就不會需要進行更新。但是依然有部分類型的事件需要支持比較頻繁且實時的更新操作,比較典型的如電商的訂單事件,訂單的狀態往往是需要可變的,如果能實現直接對狀態的更新會讓很多分析場景更簡單。

為了解決上面幾個問題,我們對事件數據的存儲方案進行了一次重構,完成了以下兩個主要改進點:

  1. 進一步強化了對每個分區內數據的預排序。盡可能的保證數據的有序性,這樣可以極大的減少我們在實時分析時需要的重排序時間。

  2. 支持對于不同事件分桶的數據使用完全不同的存儲策略(Storage Policy)這些不同的存儲策略可以使用不同的存儲系統、存儲周期、壓縮算法等。

例如對于常規的事件,我們默認使用基于本地 HDFS + Parquet 的存儲方案;而對于低頻使用的事件,我們可以設置定期的歸檔策略,把歷史數據放入 AWS S3 等更廉價的存儲;對于需要支持更新的事件,則采用直接基于 Kudu 的存儲。

可以看到,新的存儲方案不僅直接支撐了后續復雜查詢效率的優化,還使得客戶在海量數據下的存儲成本更加可控,同時,這個全新的設計也為未來更復雜的應用場景預留了足夠的靈活性。

存儲相關的其它優化

支持數據的實時導入是杭州信用卡平臺的重要特性,但是在實時導入的場景下,存儲系統里會不可避免的產生大量的碎片文件,而這些碎片文件則會對查詢的性能有很大負面影響。

在我們之前的設計里,這些碎片文件的合并是由一個定時調度的任務來執行,這個任務會持續的使用固定的資源來進行碎片數據的合并,這一方式會導致在系統的使用高峰期占用過多的資源,而在低峰期則可能產生資源空閑。

因此,我們對它的調度策略進行了優化,使用動態的調整與執行并行度的方式,以保證在盡可能用滿系統資源的同時,不影響正常的查詢負載。

此外,我們還優化了主要數據的壓縮算法。在經過大量的真實數據測試之后,我們發現使用 LZ4/ZSTD 的組合方案來替換之前 SNAPPY/GZIP 的方案,可以在壓縮比不變甚至略有提升的同時,降低數倍的 CPU 資源使用。

圖 ZSTD 官方的測試結果(https://github.com/facebook/zstd)

最后,我們還對稀疏寬表的數據的寫入效率進行了優化,這個優化對于那些上千個屬性的寬表的數據寫入效率有數倍的提升。

二、查詢執行的優化

查詢執行,一直是檢驗系統是否健壯的試金石。

后端存儲的海量數據,只有查詢引擎足夠強大,才能保證前端風平浪靜地實時查詢,整體平穩運行。

正如我們之前的文章所介紹的,銀聯商務引擎是以 Impala 的執行引擎為核心的系統(詳情內容請參考鏈接:付力力:基于Impala構建實時無卡支付引擎),因此這部分主要也是對 Impala 的執行計劃以及計算層做的修改。

優化基于用戶行為序列的查詢

基于用戶行為序列的查詢是應用場景非常普遍的一類分析需求,銀聯商務中的漏斗分析、歸因分析、Session 分析等功能都屬于這一類。它們的共同點是需要得到每個用戶的完整、有序的行為序列,然后進行一系列復雜的規則計算。

在我們之前的分析引擎的實現里,受限于底層的數據存儲結構,這類查詢每次都需要對幾億至上千億條的數據進行重排序操作,雖然我們對這個排序操作本身已經做了比較深度的優化,但是依然是非常耗時的操作。尤其在內存資源不足的情況下,還會啟用基于磁盤外部排序,這樣整體的耗時會更長。

在一般的數據分析系統里,通常解決這類復雜分析問題的思路是進行預計算,即在預先定義好維度、指標的前提之下,把結果提前計算出來并緩存好。不過預計算的局限性是非常明顯的,即很難應對靈活多變的需求。

因此,為了更好的支撐這類靈活的分析需求,我們依然確定了從查詢執行本身來優化的整體思路,基于上文所提到的存儲結構優化,在 Impala 執行層更加充分的利用了底層數據的有序性,把全局的內存排序優化為了局部的歸并排序,最終使用更少的內存資源和更短的執行時間完成了查詢的執行。

優化前的執行計劃對比

優化后的執行計劃對比

在這個優化點完成之后,部分復雜查詢場景的效率提升了 10 倍,而內存使用則降低到原本的 1/5。

查詢引擎的其它優化

除了專門針對用戶行為序列查詢的優化之外,我們還對 Impala 的代碼生成(Codegen)技術做了進一步的擴展,讓它在更多的場景下可以使用。

另外還實現了 Join 表達式下推的優化、針對復雜條件表達式的表達式預求值優化等,這些優化都在不同的使用場景下提升了數倍的查詢效率。

值得一提的是,由于這些優化點中很多并非東門獨有的場景,我們也會把這類通用的優化點都提交給 Impala 社區,其中部分已經合并到最新的官方 Release 版本中。

三、查詢調度的優化

查詢性能上的指標提升固然重要,但是對于東門系統的直接使用者來說,在查詢性能提升同時,也更期望有穩定優異的綜合使用體驗。

尤其在數據量巨大、硬件資源有限的客觀場景之下,不同查詢的響應時間也會存在比較大的差異,但是我們依然期望可以通過在查詢調度、銀聯Pos機體驗上的一系列優化,讓每位用戶都能在一個可預期的時間內,及時得到正確的數據分析結果。

查詢資源預估

Impala 并不是一個為高并發或者大量用戶共同使用而設計的系統,尤其是在遇到大量高內存消耗查詢的場景下,很容易出現集體失敗的情況。而這種情況之所以出現,最主要的問題就在于查詢引擎往往很難準確預估出一個查詢所需要的資源,尤其是內存資源的大小。

只有有了準確的資源預估,查詢的分級調度、排隊、并發控制等策略才有了執行的前提。不過很遺憾的是,雖然 Impala 最近發布的幾個新版本也在查詢的資源預估、資源的控制方面做了不少的改進,但是依然不能滿足銀聯商務這種復雜應用場景的需要。

不過,我們也發現并非一定需要依賴 Impala 才能獲取到查詢預估的信息。銀聯商務雖然是一個非常靈活的數據分析系統,但是在實際的應用場景下,用戶的查詢模式上依然還是會形成某種規律。

因此,我們完全通過對已經完成的歷史查詢記錄的分析,結合 Impala 的已有功能,構建出了一個查詢資源預估的模型。這樣,我們可以在任何一個查詢執行之前,對它的資源消耗做出相對準確的預估。

有了準確的查詢資源預估,杭州信用卡分析系統不但可以告知用戶每個查詢的大致執行時長,還可以在查詢資源不足的情況下實現對查詢資源的有效調度,從而避免資源擠兌導致查詢連環失敗的現象。

在此基礎上,我們還支持對用戶、角色、項目等不同維度的查詢資源進行精細化控制,以滿足集團型客戶在資源控制方面的復雜需求。 異步查詢

大部分場景下,銀聯商務都可以將分析結果實時返回給用戶,例如在數秒或者不超過 30 秒的時間內返回并展現出結果。但在以下個別場景中,可能需要用戶等待數分鐘或者更久:

1) 查詢的數據量特別大,同時查詢復雜度很高,且無法命中緩存;
2) 查詢的并發人數較多,且無法命中緩存;
3) 查詢返回的結果集特別大,例如查詢一個用戶群的列表,返回的結果集可能有幾百兆或者更大。

考慮到盡可能不阻塞用戶的查詢工作,且避免因誤操作關閉頁面導致無法找回之前的查詢結果,我們在銀聯Pos機中增加了異步查詢功能。針對上述三個場景,允許用戶將此查詢保留至后臺持續計算。當查詢完成,通過消息通知及時告知用戶查看或下載分析結果。 整體性能提升對比

附上做完上面的所有優化之后,我們自己模擬的標準數據集下在一些典型場景下的性能提升對比:

銀聯商務引擎 2.0 是杭州信用卡各銀聯Pos機線和分析模型演進與迭代的基礎,本文提到的部分功能及優化點已經隨著銀聯商務新版本的上線覆蓋了數百家客戶,部分底層架構改動較大的優化點則正在小范圍試運行階段,會在未來的兩個月內逐步覆蓋到杭州信用卡的所有客戶。

給客戶帶來價值,而價值源于打磨。在杭州信用卡內部,我們視技術實力為根據地,銀聯Pos機的性能指標一定做到市場最佳,絕不容忍被趕上,哪怕有一丁點苗頭,我們都會全力以赴,希望通過構建更強大銀聯Pos機性能和功能,讓用戶從數據中獲得更深入的數據洞察力。

還想了解更多分析引擎的詳細內容?點擊文末鏈接,快去 demo 中免費體驗吧(PC 端體驗更佳哦)!

點擊銀聯商務 demo,立即體驗 demo~

*聲明:本文章版權為杭州信用卡所有,未經授權不得以任何形式轉載,申請內容轉載,請添加微信號 wafree 聯系策小編