1. 程式人生 > >HBase表設計圖解

HBase表設計圖解

為什麼要進行md5 或 Hash 或進行反轉?

一句話說明:負載均衡,可以將記錄平均分到不同的region

比如:業務id有時候開頭是跟業務相關的一些編碼。有個可能某個編碼下面對應記錄比較多,某些編碼對應比較少。

比如上圖示例中1111開頭的有3條資料。其他字首的都在3條以下

所以通過md5或者其他方式進行雜湊。

MD5  =>   DHS中選十六進位制(string)

手機號反轉=>DHS中選十進位制(string)

其他自定義hash並序列化儲存的=>DHS中選二進位制

api:

寫入:table.put  

查詢:通過rowkey精準查詢:table.get( Get(rowkey) )

DHS選“十六進位制String型別”

MD5開頭字首作為rowkey程式碼寫法:

123456import com.google.common.hash.Hashing;String uid="uid01";String md5_uid= Hashing.md5().newHasher().putString(uid).hash().toString();String rowkey=md5_uid+"其他內容";  //因為是字首匹配,只要字首是MD5開頭的就可以,後面有其他內容沒關係。Put put=new Put(rowkey.getBytes());    table.put(put);

2.Scan操作(掃描操作):

利用hbase表,字典排序的特性,進行的掃描操作,要查詢的資料有共同的字首

scan操作不是無限制的!

scan操作一般都設定startkey,stopkey。資料量比較多的時候要增加salt_bucket

但是這還不夠:為防止超時,scan 1w條以上的操作,要分成多次進行scan。因為scan資料操作會有大量的磁碟讀取操作(磁碟IO升高),把結果放入記憶體(佔用記憶體導致GC頻率升高),再通過RPC傳送到客戶端(網路頻寬)。

如果設定Filter進行過濾呢?——即使設定了Filter,也會掃描startkey到stopkey之間的所有資料。再在記憶體中過濾之後再返回客戶端。

對客戶端有什麼影響?如果不分批掃描,除了對伺服器磁碟記憶體網路造成壓力,也會造成客戶端超時。

下面是增加salt_bucket之後,分多個執行緒同時scan的情況。如果沒有分salt_bucket,就是其中一個scan執行緒的情況。