Hbase表格設計
Rowkey設計
Region: 基於RowKey的分割槽,可理解成MySQL的水平切分。
每個Region Server就是Hadoop叢集中一臺機器上的一個程序。
比如我們的有1-300號的RowKey, 那麼1-100號RowKey的行被分配到Region Server 1上,同樣,101-200號分配到Region Server 2上, 201-300號分配到Region Server 3上。
在記憶體模型中,我們說RowKey保證了相鄰RowKey的記錄被連續地寫入了磁碟。在這裡,我們發現,RowKey決定了行操作(增,刪,改,查)會被交與哪臺Region Server操作。
熱冷資料
讓我們假設一下,如果我們的RowKey以記錄的TimeStamp起始,從記憶體模型上說,這很合理,因為我們可能面臨大量的使用者流水記錄查詢,查詢的條件會設定一個時間片段,我們希望一次性從磁碟中讀取這些流水記錄,從而避免頻繁的磁碟尋道操作。
但是再另一方面,使用者的流水記錄查詢會很頻繁的出現“截至到至今”的查詢條件,依照我們上面的程序模型,Region Server 3一定會被分配到(因為最近的記錄排在最後),這樣就可能造成Region Server 3的“過熱”,而Region Server 1“過冷”的情況。
總結
基於以上的模型,大致的理解是:
1. RowKey決定了行操作任務進入RegionServer的數量,我們應該儘量的讓一次操作呼叫更多的Region Server,已達到分散式的目的。
2. RowKey決定了查詢讀取連續磁碟塊的數量,最理想的情況是一次查詢,在每個Region Server上,只讀取一個磁碟塊。
3. ColumnFamily決定了一次查詢需要讀取的檔案數(不同的檔案不僅意味著分散的磁碟塊,還意味著多次的檔案開啟關閉操作)。我們應儘量將希望查詢的結果集合併到一個ColumnFamily中。同時儘量去除該ColumnFamily中不需要的列。
4. HBase官方建議儘量的減少ColumnFamily的數量。