HBase表rowKey設計原則

2022-06-21 16:12:12 字數 1820 閱讀 5735

rowkey設計首先應當遵循三大原則:

rowkey是乙個二進位製碼流,可以為任意字串,最大長度為64kb,實際應用中一般為10-100bytes,它以byte形式儲存,一般設定成定長。

一般越短越好,不要超過16個位元組,注意原因如下:

1、目前作業系統都是64位系統,記憶體8位元組對齊,控制在16位元組,8位元組的整數倍利用了作業系統的最佳特性。

2、hbase將部分資料載入到記憶體當中,如果rowkey過長,記憶體的有效利用率就會下降。

如果rowkey按照時間戳的方式遞增,不要將時間放在二進位製碼的前面,建議將rowkey的高位位元組採用雜湊字段處理,由程式隨即生成。

低位放時間字段,這樣將提高資料均衡分布,各個regionserver負載均衡的機率。

如果不進行雜湊處理,首字段直接使用時間資訊,所有該時段的資料都將集中到乙個regionserver當中,這樣當檢索資料時,負載會集中到個別regionserver上,造成熱點問題,會降低查詢效率。

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

但是這裡的量不能太大,如果太大需要拆分到多個節點上去。

所以良好的rowkey設計,應當遵循三大原則,並且能讓資料分散,從而避免熱點問題。

1.1 加鹽

這裡所說的加鹽並非密碼學中的加鹽,而是在rowkey的前面分配隨機數,當給rowkey隨機字首後,它就能分布到不同的region中,這裡的字首應該和你想要資料分散的不同的region的數量有關。

1.2 預分割槽

通常hbase會自動處理region拆分,當region的大小到達一定閾值後,region將被拆分成兩個,之後在兩個region都能繼續增長資料。

然而在這個過程當中,會出現兩個問題:

第一點,就是我們所說的熱點問題,資料會繼續往乙個region中寫,出現寫熱點問題;

第二點,則是拆分合併風暴,當使用者的region大小以恆定的速度增長,region的拆分會在同一時間發生,因為同時需要壓縮region中的儲存檔案,這個過程會重寫拆分後的region,這將會引起磁碟i/o上公升 。

壓縮:hbase支援大量的壓縮演算法,而且通常開啟壓縮,因為cpu壓縮和解壓的時間比從磁碟讀寫資料的時間消耗的更短,所以壓縮會帶來效能的提公升。

對於拆分合併風暴,通常我們需要關閉hbase的自動管理拆分。然後手動呼叫hbase的split(拆分)和major_compact(壓縮),對其進行時間控制,來分散i/o負載。

但是其中的split操作同樣是高i/o的操作。

為了解決這些問題,預分割槽就是一種很好的方法,通常它和加鹽結合起來使用。

所謂預分割槽,就是預先建立hbase表分割槽。這需要我們明確rowkey的取值範圍和構成邏輯。

1.3 雜湊

細心的同學可能會發現,在我們剛剛提出的加鹽與預分割槽rowkey設計方法中,並沒有完整運用到rowkey設計的雜湊原則。

更一步思考下,我們會發現如果只運用加鹽與預分割槽rowkey設計方法,資料會真正無序隨即分布在hbase集群當中,這並沒有讓我們利用到hbase根據字典順序排序的這一特點。

由此,雜湊這一設計理念便順理成章的出現在我們眼前。

1.4 反轉

對於以手機號碼這樣比較固定開頭的rowkey(例如開頭177,159,138),但是它的後幾位都是隨機的,沒有規律的。我們可以將手機號反轉之後作為rowkey,

這樣就避免了熱點問題。

這就是rowkey設計的另一種方法反轉,通過反轉固定長度或者數字格式的rowkey。這樣可以使得rowkey中經常改變的部分(最沒有意義的部分)放在前面。

這樣可以有效的隨機rowkey,但是犧牲了rowkey的有序性。

hbase 順序序列rowkey設計

import org.apache.hadoop.hbase.util.bytes import org.apache.hadoop.hbase.util.md5hash public class sequenceidrowkeyhash 暫時想到這種設計方法,可以避免寫入熱點問題,也可以進行預分割...

HBase的RowKey設計原則

hbase是三維有序儲存的,通過rowkey 行鍵 column key column family和qualifier 和timestamp 時間戳 這個三個維度可以對hbase中的資料進行快速定位。hbase中rowkey可以唯一標識一行記錄,在hbase查詢的時候,有以下幾種方式 通過get方...

HBase的RowKey設計原則

hbase是三維有序儲存的,通過rowkey 行鍵 column key column family和qualifier 和timestamp 時間戳 這個三個維度可以對hbase中的資料進行快速定位。hbase中rowkey可以唯一標識一行記錄,在hbase查詢的時候,有以下幾種方式 通過get方...