Apache Kylin 優化指南

Apache Kylin 優化指南

一. 維度優化

爲什麼需要維度優化

如果不進行任何維度優化,直接將所有的維度放在一個聚集組裏,Kylin將會計算所有的維度組合(cuboid)。比如,有12個維度,Kylin 就計算2的12次方即4096個cuboid,實際查詢可能用不到cuboid 不到1000個,甚至更少。如果進行圍堵優化,會造成集羣計算和存儲資源的浪費,也會影響cube的build和查詢性能。

當你保存的cube時遇到下面的異常信息時,意味着一個聚合組已經大於4096,你就必須進行維度優化了。

image_1aufkne841pr4155d15bh1cmigf09.png-43.3kB

如何計算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。

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