hbase的讀寫數據流程、設計原則以及時間戳反轉

1.1、HBase的讀數據過程

1、客戶端通過 zookeeper 以及-root-表和.meta.表找到目標數據所在的 regionserver(就是數據所在的 region 的主機地址)
(0.98版本以前,0.98及以後沒有-ROOT-表)
2、聯繫 regionserver 查詢目標數據
3、 regionserver 定位到目標數據所在的 region,發出查詢請求
4、 region 先在 memstore 中查找,命中則返回
5 、 如果在 memstore 中找不到,則在storefile 中掃描 (可能會掃描到很多的storefile----BloomFilter)

1.2、HBase的寫數據過程
1、 client 先根據 rowkey 找到對應的 region 所在的 regionserver
2、 client 向 regionserver 提交寫請求
3、 regionserver 找到目標 region
4、 region 檢查數據是否與 schema 一致
5、如果客戶端沒有指定版本,則獲取當前系統時間作爲數據版本
6、將更新寫入 WAL log
7、將更新寫入 Memstore

1.3、HBase的rowkey的設計原則

HBase是三維有序存儲的,通過rowkey(行鍵),column key(column family和qualifier)和TimeStamp(時間戳)這個三個維度可以對HBase中的數據進行快速定位。

HBase中rowkey可以唯一標識一行記錄,在HBase查詢的時候,有兩種方式:

1、通過get方式,指定rowkey獲取唯一一條記錄
2、通過scan方式,設置startRow和stopRow參數進行範圍匹配

3、全表掃描,即直接掃描整張表中所有行記錄

1.4、rowkey長度原則:

rowkey是一個二進制碼流,可以是任意字符串,最大長度64kb,實際應用中一般爲10-100bytes,以byte[]形式保存,一般設計成定長。建議越短越好,不要超過16個字節,原因如下:

數據的持久化文件HFile中是按照KeyValue存儲的,如果rowkey過長,比如超過100字節,1000w行數據,光rowkey就要佔用100*1000w=10億個字節,將近1G數據,這樣會極大影響HFile的存儲效率;
MemStore將緩存部分數據到內存,如果rowkey字段過長,內存的有效利用率就會降低,系統不能緩存更多的數據,這樣會降低檢索效率。

1.5、時間戳反轉
一個常見的數據處理問題是快速獲取數據的最近版本,使用反轉的時間戳作爲rowkey的一部分對這個問題十分有用,可以用Long.Max_Value - timestamp追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通過scan [key]獲得[key]的第一條記錄,因爲HBase中rowkey是有序的,第一條記錄是最後錄入的數據。

比如需要保存一個用戶的操作記錄,按照操作時間倒序排序,在設計rowkey的時候,可以這樣設計
[userId反轉][Long.Max_Value - timestamp],在查詢用戶的所有操作記錄數據的時候,直接指定反轉後的userId,startRow是[userId反轉][000000000000],stopRow是[userId反轉][Long.Max_Value - timestamp]

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