列式存儲: 區別於傳統的行式存儲,在存儲層,把同一列的數據放在一起,利於聚合查詢,不利於明細查詢、INSERT/UPDATE等。
Hbase: 列式存儲的一種實現
組成部件說明:
Row Key: Table主鍵 行標識
Timestamp: 每次對數據操作對應的時間戳,即數據的version number(Hbase無法update,每次操作都是追加)
Column Family: 列簇,一個table在水平方向有一個或者多個列簇,列簇可由任意多個Column組成,可動態擴展,無須預定義數量及類型,二進制存儲,用戶需自行進行類型轉換
邏輯視圖:
物理視圖:
系統架構
- Table中所有行都按照row key的字典序排列;
- Table在行的方向上分割為多個Region;
- Region按大小分割的,每個表開始只有一個region,隨着數據增多,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region,之后會有越來越多的region;
- Region是Hbase中分布式存儲和負載均衡的最小單元,不同Region分布到不同RegionServer上。
- Region是分布式存儲的最小單元,不是存儲的最小單元。在每台機器上Region由一個或者多個Store組成,每個store保存一個columns family;每個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內存中,StoreFile存儲在HDFS上。
- MemStore 是放在內存里的,保存修改的數據即keyValues。當MemStore的大小達到一個閥值(默認64MB)時,MemStore會被Flush到文件,即生成一個快照。目前HBase會有一個線程來負責MemStore的Flush操作。
- MemStore內存中的數據寫到文件后就是StoreFile,StoreFile底層是以HFile的格式保存。
- HFile,HBase中KeyValue數據的存儲格式,是Hadoop的二進制格式文件。

Kylin: 以hbase為存儲,維度做RowKey,指標做列族,支持SQL查詢的預計算服務
Rowkey可以理解為“索引”,如:0001111是把維度ABCD作為索引的一份數據集,1110001是把維度AEFG作為索引的一份數據集....
每一種“索引”都包含了全量數據,稱之為一個cuboid,如:原數據集大小為1G,有7個維度,那么預計算所有維度的結果集大小將是128G
正常的業務生產中不可能需要預計算所有維度,並且維度與維度間有可能還有內在關系(如:省市區),所以維度爆炸的問題可以通過kylin的剪枝策略避免
剪枝策略是基於業務場景和維度間的關系等多種因素減少cuboid個數的一種思路,目前Kylin可以使用的維度優化手段有以下幾種:
- 聚集組
- 衍生緯度(如:cityName之於cityId)
- 強制維度(如:很多業務場景都是按天查詢的,datekey便可設為強制維度,可以把cuboid的個數由128直接降為64)
- 層次維度(如:省-市-區)
- 聯合維度(類似於聯合索引,業務上一定會一起作為條件去查詢的幾個維度)
- Extended Column
待學習補充:
列式存儲中的壓縮存儲、非精確去重、hyperloglog、bitmap