Apache Kylin 深入Cube和查詢優化

前言

近幾年,Apache Kylin作爲一個高速的開源分佈式大數據查詢引擎正在迅速崛起。它充分發揮Hadoop、Spark、HBase等技術的優勢,通過對超大規模數據集進行預計算,實現秒級甚至亞秒級的查詢響應時間,同時提供標準SQL接口。目前,Apache Kylin已在全球範圍得到了廣泛應用,如百度、美團、今日頭條、eBay等,支撐着單個業務上萬億規模的數據查詢業務。在超高性能的背後,Cube是至關重要的核心。一個優化得當的Cube既能滿足高速查詢的需要,又能節省集羣資源。本文將從多個方面入手,介紹如何通過優化Cube提升系統性能。

Cube基本原理

在傳統多維分析就有多維立方體(OLAP Cube)的概念。Apache Kylin在大數據領域對Cube進行了擴展,通過執行 MapReduce/Spark任務構建Cube,對業務所需的維度組合和度量進行預聚合,當查詢到達時直接訪問預計算聚合結果,省去對大數據的掃描和運算,這就是Apache Kylin高性能查詢的基本實現原理。

如圖1所示,Apache Kylin會對SQL的查詢計劃進行改寫,把源表掃描、多表連接、指標聚合等在線計算轉換成對預計算結果的讀取,極大減少了在線計算和I/O讀寫的代價。 而查詢所訪問的預計算結果保存在Cuboid當中(見圖1紅色方框),Cuboid大小隻和維度列的基數有關,和源數據行數無關,這使得查詢的時間複雜度可以取得一個量級的提升。
在這裏插入圖片描述

圖1 預計算查詢計劃

一個Cuboid對應着一組分析的維度,並保存了度量的聚合結果。Cube就是所有Cuboid的集合,如圖2所示,每個節點代表一個Cuboid。當查詢到達,Apache Kylin會根據SQL所使用的維度列在Cube中選擇最合適的Cuboid,最大程度地節省查詢時間。
在這裏插入圖片描述

圖2 Cube示意圖

Cube優化案例

社區不乏一些使用Apache Kylin的成功案例分享,但經常還會看到很多朋友遇到性能問題,例如SQL查詢過慢、Cube構建時間過長甚至失敗、Cube膨脹率過高等等。究其原因,大多數問題都是由於Cube設計不當造成的。因此,合理地進行Cube優化就顯得尤爲重要。

這裏先分享兩個社區用戶進行優化的案例:

案例1 – 提升Cube查詢效率

背景:某智能硬件企業使用Apache Kylin作爲大數據平臺查詢引擎,對查詢性能有較高要求,希望提高查詢效率。

數據:

  • 9個維度,其中1個維度基數是千萬級,1個維度基數是百萬級,其他維度基數是10w以內
  • 單月原始數據6億條

優化方案:

  • 數據清理:將時間戳字段轉換成日期,降低維度的基數
  • 調整聚合組:不會同時在查詢中出現的維度分別包含在不同聚合組(如崩潰時間、上傳時間等)
  • 設置必須維度:把某些超低基數維度設爲必須維度

優化成果:

  • 查詢性能:提升5倍
  • 構建時間:縮短30%
  • Cube大小:減小74%

案例二 – 提升Cube構建效率

背景:某金融企業使用Apache Kylin作爲報表分析引擎,發現Cube膨脹率多大、構建時間過長,希望對這一情況進行改善。

硬件:20臺高配置PC服務器

數據:事實表有100多萬條記錄,度量是某些列的平均值

優化方案:

  • 維度精簡:去除查詢中不會出現的維度
  • 調整聚合組:設置多個聚合組,每個聚合組內設置多組聯合維度

優化成果:
在這裏插入圖片描述

Cube優化原理

從以上案例可以看出,通過Cube調優可以顯著改善Apache Kylin的構建性能、查詢性能及Cube膨脹率。那麼這些改進的背後究竟是什麼原理呢?

爲了深入理解Cube,首先要先了解Cuboid生成樹。如圖3所示,在Cube中,所有的Cuboid組成一個樹形結構,根節點是全維度的Base Cuboid,再依次逐層聚合掉每個維度生成子Cuboid,直到出現0個維度時結束。圖3中綠色部分就是一條完整的Cuboid生成路徑。預計算的過程實際就是按照這個流程構建所有的Cuboid。
在這裏插入圖片描述

圖3 Cuboid生成樹

通過這顆Cuboid生成樹,我們不難發現:當維度數量過多,就會導致Cuboid數量以指數級膨脹;如果維度基數過大,還會使所在的Cuboid結果集變大。這些都是影響Cube膨脹率和構建時間的重要因素。

但是,所有的Cuboid都是必要的嗎?實際上,在多數情況下,我們並不需要這裏的每一個Cuboid,因此需要對Cuboid生成樹做剪枝。剪枝可以從兩個方面入手:數據特性、查詢需求。首先介紹數據特性,考慮下圖的兩個Cuboid,左側Cuboid包含4個維度(ABCD),右側Cuboid包含3個維度(ABC),而兩個Cuboid都包含相同(或極度相近)行數的記錄,說明讀取兩個Cuboid結果的代價是一樣的,同時左側Cuboid除了具有右側Cuboid的查詢支持能力外,還能支持帶有維度D的查詢,因此右側Cuboid就可以被去除。
在這裏插入圖片描述

圖4 去除冗餘Cuboid

再考慮查詢需求,在報表或多維分析場景中,有些維度是每次查詢都會出現的,如年份;有些維度總是一起出現的,如開始時間、結束時間;有些維度間是有層級關係的,如商品分類或地理信息。充分利用查詢的這些實際需求也能去除不需要的Cuboid,例如:如果年份是必要的,那麼所有不包含年份維度的Cuboid都可以被去除;如果兩個維度總是同時出現,那麼這這些維度單獨出現的Cuboid就可以被去除。

在Apache Kylin中,可以通過設置Cube的維度組合規則來去除無用的Cuboid。首先,可以通過定義聚合組對維度分組,只在每個聚合組內生成Cuboid。此外,在單個聚合組內部,還可以設置維度組合規則,如:必須維度用於定義一定出現的維度、聯合維度用於定義一組同時出現的維度、層級維度用於定義一組有層級關係的維度,詳細的Cuboid生成規則如下圖所示:
在這裏插入圖片描述

圖5 聚合組規則

Cube優化工具

上文介紹了Cube設計和優化的基本原理,但是如何實踐是一個比較有挑戰的事情,需要操作者對這些原理的實現細節、數據特性、查詢需求都有較深理解。所謂工欲善其事,必先利其器。這裏介紹一個Cube優化的神器KyBot(https://kybot.io),可以通過可視化手段展現Apache Kylin中的各項統計指標,並進行智能化評分及規則,有助於快速定位查詢、構建瓶頸和尋找解決方案。

KyBot的使用也十分簡單,只需要簡單上傳包含日誌的診斷包,後臺會自動對診斷包中的查詢、構建日誌等歷史進行分析,挖掘可能的Cube設計缺陷,通過可視化頁面直觀地展現出來。如果希望對日誌中的敏感信息(如IP地址等)進行脫敏保護,也可以簡單解決。

總結

本文着重介紹了Apache Kylin中對Cube和查詢進行優化的原理、工具、方案和案例,希望能夠幫助使用Apache Kylin的朋友解決工作上的棘手問題。查詢需求可能隨着業務發展而不斷變化,而Cube優化就是不斷保證Cube性能的有效手段。爲了更加高效地完成調優,使用KyBot是一個最簡單的方式,未來的KyBot也會更加自動化和智能化。最後,希望“麒麟神獸”在每一片大數據草原上都能施展最大的威力!

本文轉載自:https://cloud.tencent.com/developer/article/1042643
原文發佈於微信公衆號 - CSDN技術頭條(CSDN_Tech)
原文發表時間:2017-06-02

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章