hbase行鍵(rowkey)設計


1.概念

HBase是采用KeyValue的列存儲,Rowkey就是KeyValue的Key,表示唯一行(和mysql主鍵概念類似)。

Rowkey是一段二進制碼流(就是以二進制形式存儲),最大長度為64KB,內容可以由使用的用戶自定義。

HBase是根據Rowkey來進行檢索的,系統通過找到某個Rowkey (或者某個 Rowkey 范圍)所在的Region,然后將查詢數據的請求路由到該Region獲取數據。

HBase的檢索支持3種方式:

(1) 通過單個Rowkey訪問,按照某個Rowkey鍵值進行get操作,獲取唯一記錄;

(2) 通過Rowkey的range進行scan,即通過設置startRowKey和endRowKey,在這個范圍內進行掃描。這樣可以按指定的條件獲取一批記錄;

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

 

2.部分鍵掃描
以下數據是hbase權威指南中示例
<userId>-<messageId> : <colfam> : <qualifier> : <timestamp> : <email-message>
12345-5fc38314-e290-ae5da5fc375d : data : : 1307097848 : "Hi Lars, ..."
12345-725aae5f-d72e-f90f3f070419 : data : : 1307099848 : "Welcome, and ..."
12345-cc6775b3-f249-c6dd2b1a7467 : data : : 1307101848 : "To Whom It ..."
12345-dcbee495-6d5e-6ed48124632c : data : : 1307103848 : "Hi, how are ..."

HBase 內部會按字典序找到第一個行鍵的位置(要么是起始鍵,要么是起始鍵的下一個鍵):<userId>-<lowest-messageId>,開始掃描這個用戶的所有郵件,緊接着下一個用戶的所有郵件,直至到掃描到結束鍵。

我們可以使用包含部分鍵的掃描機制設計出比較有效的左對齊索引,當一個字段被加到行鍵中,就多了一個可以檢索的維度(注意檢索必須包含從左到右的某幾個字段):<userId>-<date>-<messageId>-<attachmentId>

ps:可以對比的理解,將mysql數據庫為了查詢效率增加索引與hbase中rowkey包含常用查詢字段類比,hbase索引將索引包含在rowkey中,rowkey設計關系到查詢效率。

 

3.分頁

使用掃描可以很方便的遍歷查詢數據子集的行。可以設定起始鍵和終止鍵限制掃描的范圍,同時在 Client 端添加 offset 和 limit 參數篩選數據。

過程如下:

1.在起始鍵位置打開一個掃描器
2.跳過 offset 數目的行
3.讀取 limit 數碼的行,並返回
4.關閉掃描器

 

4.rowkey設計原則

一條數據的唯一標識是 rowkey,這條數據存儲於哪個分區,取決於 rowkey 處於哪個一個預分區的區間內,設計 rowkey 的主要目的 ,就是讓數據均勻的分布於所有的 region 中

1. rowkey 長度原則
  Rowkey 是一個二進制碼流,設計成定長的,且盡量短。

2. rowkey 散列原則
  如果 Rowkey 是按時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將 Rowkey 的高位作為散列字段,由程序循環生成,低位放時間字段,這樣將提高數據均衡分布在每個 Regionserver 實現負載均衡的幾率。

如果沒有散列字段,首字段直接是時間信息將產生所有 新數據都在一個 RegionServer 上堆積的熱點現象,這樣在做數據檢索的時候負載將會集中 在個別 RegionServer,降低查詢效率。row key是按照字典序存儲,

設計row key時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。

3. rowkey 唯一原則

  必須在設計上保證其唯一性。rowkey 是按照字典順序排序存儲的,因此,設計 rowkey 的時候,要充分利用這個排序的特點,將經常讀取的數據存儲到一塊,將最近可能會被訪問 的數據放到一塊。

 

5.輔助索引

hbase沒有提供輔助索引

ps:這里輔助索引類似mysql非聚集索引,其實就是根據非聚集索引查詢找到聚集索引進行數據獲取

 

在輔助索引的實現技術上常用方案:
1. 表索引
使用單獨的hbase表存儲索引數據,業務表的索引列值做為索引表的rowkey,業務表的rowkey做為索引表的qualifier或value。

2. 列索引
與業務表使用相同表,使用單獨列族存儲索引,用戶數據列值做為索引列族的Qualifier,用戶數據Qualifier做為索引列族的列值。

兩種方案都存在一定的問題,一個數據的一致性無法保證,一個使用在特定場景

關於這塊現在一些技術中對Hbase相關聯的技術擴展IHbase,ITHBase

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM