HBase RowKey設計和預分割槽

2021-09-13 15:46:49 字數 2148 閱讀 6971

hbase讀寫效能優化一般可以從三個方面入手

1、hbase服務端讀寫配置

2、hbase客戶端配置

3、hbase表的設計

本文從表設計的rowkey和預分割槽角度優化hbase讀寫效能,避免region讀寫熱點問題。

先了解hbase讀取資料方式:

1、隨機讀:通過get方式,指定rowkey獲取唯一記錄

2、區域性順序讀(隨機讀+順序讀):通過scan方式,設定startrow和stoprow引數進行範圍匹配

3、順序讀(全表順序讀):通過scan方式,全表掃瞄,並通過filter過濾出資料

hbase資料分成多個region存在於集群各機器上,region的資料邊界是startkeyendkey,所以設計乙個好的rowkey,使讀寫請求均勻落在各個region上尤為重要。

rowkey設計思路大致有以下幾種:

1、隨機

取乙個隨機數作為rowkey,如new random().nextlong()

讀取方式:只支援全表掃表,無法支援隨機讀

2、雜湊

取業務id的雜湊值作為rowkey,如hash(url)

讀取方式:支援隨機讀和順序讀,不支援區域性順序讀

3、雜湊+業務id(推薦)

對業務id取雜湊,再拼接業務id,如hash(url)+url

讀取資料:支援隨機讀、區域性順序讀、順序讀

hbase表預分割槽

避免讀寫熱點:hbase表預分割槽設計,加上rowkey的合理設計,使得讀寫資料請求分散在多個region上。

提前預防region**:hbase表的單個region超過一定大小後,會進行**,**後的major compaction會占用大量的系統資源(cpu,io,記憶體,頻寬),導致讀寫延遲,並且compaction極有可能導致寫阻塞。

語法:指定預分割槽數目和分割槽策略

create 't1', 'f1',

指定分割槽rowkey,rowkey是前乙個分割槽的stopkey,後乙個分割槽的startkey,第乙個分割槽沒有startkey,最後乙個分割槽沒有stopkey

create 't1', 'f1', splits => ['1', '2', '3', '4']

以檔案形式指定分割槽的rowkey

create 't1', 'f1', splits_file => 'splits.txt'

在splits.txt中,每一行為乙個rowkey

123

4

需求:往hbase一張表寫入大概800g的網頁資料,以url作為業務id,同乙個站點的資料聚集寫入。

分析:hbase預設每個region的最大大小10g,每個region預留空間20%,乙個region可儲存資料為8g,800/8=100,所以預分割槽數目為100。

以url為業務id,且同乙個站點資料一起寫入,如果直接以url作為rowkey,則短時間內所有寫入請求都落在乙個region上,造成寫熱點,所以,對url適當處理按照雜湊+業務id的方式處理比較合適。

region分割槽檔案可以設計如下:

總共99行,分成100個區,每個分割槽中rowkey的字首為乙個固定的兩位數字(注意01-09前面補0了)。

雜湊處理:
字首prefix=hash(url)%(expectregionnum),可以採用字串預設雜湊值對expectregionnum取餘。

最終的rowkey=prefix+url

支援讀取方式:

隨機get:以上述相同的方式獲得url的rowkey,然後進行get

區域性順序讀:指定讀取的url範圍為url1~url2,需要分別掃瞄落在各個字首區間的資料,如落在以005字首的區間內,掃瞄時的startkey=005url1,stopkey=005url2,迴圈處理[00-99]各個字首,即可完成對url1~url2區間內資料的掃瞄。(該讀取方式還是有一點點複雜)

全表順序讀:無需講解。

HBase RowKey設計原則

對於關係型資料庫,資料定位可以理解為 二維座標 但是hbase中需要四維來定位乙個單元格,即 行健 列族 列限定符 時間戳 hbase中的行是按照rowkey的字典順序排序的,這種設計優化了scan操作,可以將相關的行以及會被一起讀取的行訪問在臨近位置,便於scan。然而糟糕的rowkey設計是熱點...

HBase Rowkey 設計指南

文章目錄 2 rowkey設計技巧 3 rowkey 設計案例剖析 我們常說看一張 hbase 表設計的好不好,就看它的 rowkey 設計的好不好。可見 rowkey 在 hbase 中的地位。那麼 rowkey 到底是什麼?rowkey 的特點如下 如果我們的 rowkey 設計為 uid ph...

HBase Rowkey 設計指南

我們常說看一張 hbase 表設計的好不好,就看它的 rowkey 設計的好不好。可見 rowkey 在 hbase 中的地位。那麼 rowkey 到底是什麼?rowkey 的特點如下 如果我們的 rowkey 設計為 uid phone name,那麼這種設計可以很好的支援以下的場景 難以支援的場...