深入 Apache Kylin Cube 与查询优化
2019獨角獸企業重金招聘Python工程師標準>>>
近幾年,Apache Kylin作為一個高速的開源分布式大數據查詢引擎正在迅速崛起。它充分發揮Hadoop、Spark、HBase等技術的優勢,通過對超大規模數據集進行預計算,實現秒級甚至亞秒級的查詢響應時間,同時提供標準SQL接口。目前,Apache Kylin已在全球范圍得到了廣泛應用,如百度、美團、今日頭條、eBay等,支撐著單個業務上萬億規模的數據查詢業務。在超高性能的背后,Cube是至關重要的核心。一個優化得當的Cube既能滿足高速查詢的需要,又能節省集群資源。本文將從多個方面入手,介紹如何通過優化Cube提升系統性能。
1、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示意圖
2、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多萬條記錄,度量是某些列的平均值
優化方案:
- 維度精簡:去除查詢中不會出現的維度
- 調整聚合組:設置多個聚合組,每個聚合組內設置多組聯合維度
優化成果:
3、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。首先,可以通過定義(1)聚合組對維度分組,只在每個聚合組內生成Cuboid。此外,在單個聚合組內部,還可以設置維度組合規則,如:(2)必須維度用于定義一定出現的維度、(3)聯合維度用于定義一組同時出現的維度、(4)層級維度用于定義一組有層級關系的維度,詳細的Cuboid生成規則如下圖所示:
圖 - 5聚合組規則
(5)衍生維度
維表中可以由主鍵推導出值的列可以作為衍?維度。使用場景:以星型模型接入時。例如用戶維表可以從userid推導出用戶的姓名,年齡,性別。優化效果:維度表的N個維度組合成的cuboid個數會從2的N次方降為2。
(1)聚集組
聚集組:用來控制哪些cuboid需要計算。
適用場景:不是只需要計算base cuboid的情況下,都需要聚集組。
注意事項:一個維度可以出現在多個聚集組中,但是build期間只會計算一次。
如果不設置聚集組,默認情況下只會計算 base cuboid。
聚集組不宜太多。
(2)強制維度
強制維度:所有cuboid必須包含的維度,不會計算不包含強制維度的cuboid。
適用場景:可以將確定在查詢時一定會使用的維度設為強制維度。例如,時間維度。
優化效果:將一個維度設為強制維度,則cuboid個數直接減半。
(3)聯合維度
聯合維度:將幾個維度視為一個維度。
適用場景: 1 可以將確定在查詢時一定會同時使用的幾個維度設為一個聯合維度。
2 可以將基數很小的幾個維度設為一個聯合維度。
3 可以將查詢時很少使用的幾個維度設為一個聯合維度。
優化效果:將N個維度設置為聯合維度,則這N個維度組合成的cuboid個數會從2的N次方減少到1。
(4)層次維度
層次維度:具有一定層次關系的維度。
使用場景:像年,月,日;國家,省份,城市這類具有層次關系的維度。
優化效果:將N個維度設置為層次維度,則這N個維度組合成的cuboid個數會從2的N次方減少到N+1。
(6)Extended Column
在OLAP分析場景中,經常存在對某個id進行過濾,但查詢結果要展示為name的情況,比如user_id和user_name。這類問題通常有三種解決方式:
a. 將ID和Name都設置為維度,查詢語句類似select name, count(*) from table where id = 1 group by id,name。這種方式的問題是會導致維度增多,導致預計算結果膨脹;
b. 將id和name都設置為維度,并且將兩者設置為聯合。這種方式的好處是保持維度組合數不會增加,但限制了維度的其它優化,比如ID不能再被設置為強制維度或者層次維度;
c. 將ID設置為維度,Name設置為特殊的Measure,類型為Extended Column。這種方式既能保證過濾id且查詢name的需求,同時也不影響id維度的進一步優化。
所以此類需求我們推薦使用 Extended Column。
(7)HBase Rowkey順序
簡單的講,查詢頻率越高的維度在Rowkey中的順序需要越靠前。
(8)調整Cube并發粒度
當Segment中某個Cuboid的大小超出一定的閾值時,系統會將該Cuboid的數據分片到多個Hbase Region Server,從而實現Cuboid數據讀取的并行化,優化Cube的查詢速度。
kylin的默認設置中
kylin.storage.hbase.min-region-count=1,
kylin.storage.hbase.max-region-count=500,?
kylin.storage.hbase.region-cut-gb=5
在實際應用中(根據實際數據量調整),可以將
kylin.storage.hbase.min-region-count=2,
kylin.storage.hbase.max-region-count=100,
kylin.storage.hbase.region-cut-gb=1
上面設置為最小為2個分區,每個分區大小為1G,最多設置100個region分區。
Refer:
[1]?Apache Kylin 深入Cube和查詢優化
http://geek.csdn.net/news/detail/199615
[2]?Apache Kylin 維度優化指南
http://bit.ly/2llpR69
[3]?【技術帖】Apache Kylin Cube優化方式
http://bit.ly/2DqB8tg
轉載于:https://my.oschina.net/leejun2005/blog/79113
總結
以上是生活随笔為你收集整理的深入 Apache Kylin Cube 与查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#非泛型集合类-使用HashTable
- 下一篇: mongodb replicaset s