Hbase的表結構設計與關係型數據庫有不少不一樣,主要是Hbase有Rowkey和列族、timestamp這幾個全新的概念,如何設計表結構就很是的重要。數據庫
Hbase就是經過 表 Rowkey 列族 timestamp肯定一行數據。數組
這與關係型數據庫徹底不一樣:ide
屬性 |
HBase |
RDBMS |
---|---|---|
數據類型 | 只有字符串 |
豐富的數據類型 |
數據操做 | 簡單的增刪改查 不支持join | 各類函數和錶鏈接 |
存儲模式 | 基於列式存儲 |
基於表格結構和行式存儲 |
數據保護 | 更新後仍然保留舊版本 |
替換 |
可伸縮性 | 輕易的增長節點,兼容性高 |
須要中間層,犧牲功能 |
因此Hbase須要考慮的因素有:函數
一、這個表應該有多少列族性能
二、列族使用什麼數據編碼
三、每一個列族有多少列加密
四、列名是什麼spa
五、單元應該存放什麼數據設計
六、每一個單元存儲多少時間版本3d
七、Rowkey結構是什麼,應該包含什麼信息
須要注意的點:
一、Join
Hbase中沒有join 因此須要大表結構 行記錄加關鍵字 解決這個問題
二、Rowkey
Rowkey設計很是重要 因爲Hbase是有序的 須要考慮前綴後綴問題
能夠經過Hbase Shell和 Java Api建立:
Configuration config = HBaseConfiguration.create();
Admin admin = new Admin(conf);
TableName table = TableName.valueOf("myTable");
admin.disableTable(table);
HColumnDescriptor cf1 = ...;
admin.addColumn(table, cf1); // adding new ColumnFamily
HColumnDescriptor cf2 = ...;
admin.modifyColumn(table, cf2); // modifying existing ColumnFamily
admin.enableTable(table);複製代碼
Rowkey是不可分割的字節數組,按字典序存儲在表中。
因爲:Region基於Rowkey爲一個區間的行提供服務 HFile在硬盤上存儲有序的行 因此Rowkey就極大的影響了Hbase的性能。
Rowkey就是索引,若是不清楚Rowkey就只能掃描全表,那麼性能將會大幅度降低。
這裏用影片熱度排行榜舉例:
一、Rowkey是以字典序從大到小
原生Hbase只支持從小到大排序,要想實現從大到小,能夠採用 Rowkey=Integer.MAX_VALUE-Rowkey的方式,在應用層再轉回來完成需求。
二、Rowkey儘可能散列
Rowkey要儘可能散列,這樣能夠保證數據不在一個Region上,從而避免了讀寫的集中。
好比咱們能夠設計 userid_videoid 拼接字符串 這樣的話user就會不均勻。
有三種辦法解決: 反轉userid 散列userid 將userid取模後進行MD5加密 取前6位加入userid中
三、Rowkey長度要儘可能短
Rowkey過長,存儲開銷會大。
Rowkey過長,會致使內存的利用率下降,進而下降索引命中率。
列族是一些列的集合,一個列族全部成員都有一樣的前綴,好比courses:history 和 courses:math都是courses列族的成員。冒號是分隔符。列族前綴必須是可輸出字符,列可由任意字節數組組成。
列族必須在表創建的時候聲明,列則不須要特別聲明,用戶隨時能夠建立新列。
經驗法則:
店鋪shop 商品 item 是多對多的關係
商鋪表:
列名 |
列含義 |
---|---|
id |
主鍵 |
name |
店鋪名稱 |
address | 所在地 |
regdate | 註冊日期 |
商品表:
列名 |
列含義 |
---|---|
id |
主鍵 |
name |
商品名稱 |
price |
價格 |
details | 商品詳情 |
title |
展現名稱 |
關係表:
列名 |
列含義 |
---|---|
shop_id | 店鋪主鍵 |
item_id | 商品主鍵 |
type |
關聯類型 |
店鋪表:
商品表:
用戶與粉絲是一對多
用戶表:
列名 |
列含義 |
---|---|
id |
主鍵 |
nickname | 用戶名 |
粉絲對應表:
列名 |
列含義 |
---|---|
user_id | 用戶id |
fans_id | 粉絲id |
更多實時計算,Hbase,Flink,Kafka等相關技術博文,歡迎關注實時流式計算