轉自:
http://www.bitstech.net/2016/01/04/kylin-olap/
http://www.csdn.net/article/2015-11-27/2826343
http://tech.youzan.com/kylin-mondrian-saiku/
Apache Kylin對傳統MOLAP的改進
計算Cube的存儲代價以及計算代價都是比較大的, 傳統OLAP的維度爆炸的問題Kylin也一樣會遇到。 Kylin提供給用戶一些優化措施,在一定程度上能降低維度爆炸的問題:
- Cube 優化:
- Hierachy Dimension
- Derived Dimension
- Aggregation Group
Hierachy Dimension, 一系列具有層次關系的Dimension組成一個Hierachy, 比如年、月、日組成了一個Hierachy, 在Cube中,如果不設置Hierarchy, 會有 年、月、日、年月、年日、月日 6個cuboid, 但是設置了Hierarchy之后Cuboid增加了一個約束,希望低Level的Dimension一定要伴隨高Level的Dimension 一起出現。設置了Hierachy Dimension 能使得需要計算的維度組合減少一半。
Derived Dimension, 如果在某張維度表上有多個維度,那么可以將其設置為Derived Dimension, 在Kylin內部會將其統一用維度表的主鍵來替換,以此來達到降低維度組合的數目,當然在一定程度上Derived Dimension 會降低查詢效率,在查詢時,Kylin使用維度表主鍵進行聚合后,再通過主鍵和真正維度列的映射關系做一次轉換,在Kylin內部再對結果集做一次聚合后返回給用戶
Aggregation Group, 這是一個將維度進行分組,以求達到降低維度組合數目的手段。不同分組的維度之間組成的Cuboid數量會大大降低,維度組合從2的(k+m+n)次冪至多能降低到 2的k次冪加2的m次冪加2的n次冪。Group的優化措施與查詢SQL緊密依賴,可以說是為了查詢的定制優化。 如果查詢的維度是誇Group的,那么Kylin需要以較大的代價從N-Cuboid中聚合得到所需要的查詢結果,這需要Cube構建人員在建模時仔細地斟酌。
- 數據壓縮:
Apache Kylin針對維度字典以及維度表快照采用了特殊的壓縮算法,對於Hbase中的聚合計算數據利用了Hadoop的LZO或者是Snappy,從而保證存儲在Hbase以及內存中的數據盡可能的小。其中維度字典以及維度表快照的壓縮考慮到DataCube中會出現非常多的重復的維度成員值,最直接的處理方式就是利用數據字典的方式將維度值映射成ID, Kylin中采用了Trie樹的方式對維度值進行編碼
- distinct count聚合查詢優化:
Apache Kylin 采用了HypeLogLog的方式來計算DistinctCount。好處是速度快,缺點是結果是一個近似值,會有一定的誤差。在非計費等通常的場景下DistinctCount的統計誤差應用普遍可以接受。
具體的算法可見Paper,本文不再贅述:
http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf
使用Apache Kylin的實踐總結
1、大的事實表采用天分區增量構建,為了不影響查詢性能,可以定期做合並(Merge),周期可以根據實際情況確定,我們一周進行一次合並。
2、對於維表比較大的情況,或者查詢Select部分存在復雜的邏輯判斷,存在Apache Kylin不支持的函數或語句時,可以將事實表和維表的關聯處理創建為Hive視圖,之后根據視圖創建Cube模型。
3、每次查詢必然帶有的條件建議在字典設置步驟將其設置為Mandatory。這樣會最終 Build出來Cube的大小會減少一半。
4、Cube的維度如果超過10個,建議將常用的聚合字段做分組,我們對於最大的16個維度分了三個組,每組大概在5個維度左右。
5、Cube定義中RowKey順序:Mandatory維度,Where過濾條件中出現頻率較多的維度,高基數維度,低基數維度。
6、對於Hierarchies,Derived維度方面配置優化可以參考社區文檔:
http://kylin.incubator.apache.org/docs/howto/howto_optimize_cubes.html
7、部署層面,可以通過Nginx在前端做負載均衡,后端啟動多個Query Server接收查詢請求處理。
