Apache Kylin 優化指南
一. 維度優化
爲什麼需要維度優化
如果不進行任何維度優化,直接將所有的維度放在一個聚集組裏,Kylin將會計算所有的維度組合(cuboid)。比如,有12個維度,Kylin 就計算2的12次方即4096個cuboid,實際查詢可能用不到cuboid 不到1000個,甚至更少。如果進行圍堵優化,會造成集羣計算和存儲資源的浪費,也會影響cube的build和查詢性能。
當你保存的cube時遇到下面的異常信息時,意味着一個聚合組已經大於4096,你就必須進行維度優化了。
如何計算1個聚合組的維度組合數
當有層次維度時,公式如下:
(hierarchy.size()+1) * hierarchyDimsList.size() * (1 << jointDimsList.size()) * (1 << normalDims.size())
當沒有層次維度時,公式如下:
(1 << jointDimsList.size()) * (1 << normalDims.size())
如何進行維度優化
確認你設置的cube維度都是你查詢時用到的。
維度優化手段
- 聚合組
- 衍生維度
- 強制維度
- 層次維度
- 聯合維度
- Extended Column
聚合組
聚合組:用來控制那些cuboid 需要計算
適用場景: 不是隻需要計算base cuboid 的情況下,都需要聚合組。
注意事項:一個維度可以出現在多個聚合組中,但是build 期間只會計算一次。
衍生維度
衍生維度:維度中可以由主鍵導出的維度作爲衍生維度。
使用場景:以星型模型接入時。例如用戶維度表可以從userid 推導出用戶的姓名,年齡,性別。
優化效果:維度表的N個維度組合成的cuboid個數會從2的N次方爲2
Mandatory維度
強制維度: 所有cuboid必須包含的維度,不會計算不包含cuboi。
適用場景:可以將確定在查詢時一定會使用的維度設置爲強制維度,例如,時間維度
優化效果:將一個維度設置爲強制維度,則cuboid 個數系那個直接減半。
Hierachy維度
層次維度:具有一定的層次關係的維度
使用場景:像 年,月,日;國家,省份,城市 這類具有層次關係的維度。
優化效果: 將N個維度設置爲層次維度,則這N個維度組合成的cuboid 個數會從2的N次方減少到N+1。
Joint維度
聯合維度:將幾個維度視爲一個維度
使用場景: 1 可以將確定在查詢時一定會同時使用的幾個維度設爲一個聯合維度。
2 可以將基數很小的幾個維度設爲一個聯合維度。
3 可以將查詢時很少使用的幾個維度設爲一個聯合維度。
優化效果:將N個維度設置爲聯合維度,則這N個維度組合成的cuboid個數會從2的N次方減少到1。
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的需求。
所以此類需求我們推薦使用 Extended Column。