Hbase 常見面試題

2021-10-12 12:31:00 字數 3198 閱讀 9657

hbase乙個分布式的基於列式儲存的資料庫,基於hadoop的 hdfs 儲存,zookeeper 進行管理。

hbase適合儲存半結構化或非結構化資料,對於資料結構字段不夠確定或者雜亂無章很難按乙個概念去抽取的資料。

hbase 為 null 的記錄不會被儲存。

基於的表包含 rowkey,時間戳,和列族。新寫入資料時,時間戳更新, 同時可以查詢到以前的版本。

hbase 是主從架構。hmaster 作為主節點,hregionserver 作為從節點。

hbase 自動把錶水平劃分成多個區域 (region) ,每個 region 會儲存乙個表裡面某段連續的資料 (每條記錄都有乙個行鍵,按照行鍵字典序排列)

每個表一開始只有乙個 region ,隨著資料不斷插入表, region 不斷增大,當增大到乙個閾值的時候, region 就會等分會兩個新的 region (裂變)

當 table 中的行不斷增多,就會有越來越多的 region 。這樣一張完整的表被儲存在多個 regionserver 上。

乙個 region 由多個 store 組成,乙個 store 對應乙個 cf (列族)

hregion 是 hbase 中分布式儲存和負載均衡的最小單元。最小單元就表示不同的hregion 可以分布在不同的 hregion server 上。 hregion 由乙個或者多個 store組成,每個 store 儲存乙個 columns family 。每個 store 又由乙個 memstore 和0 至多個 storefile 組成。如圖: storefile 以 hfile 格式儲存在 hdfs 上。

1. rowkey唯一原則:

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

2.rowkey 長度原則

rowkey 是乙個二進位製碼流,可以是任意字串,最大長度 64kb,實際應用中一般為 10-100bytes,以 byte 形式儲存,一般設計成定長。建議越短越好,不要超過 16 個位元組, 原因如下:

資料的持久化檔案 hfile 中是按照 keyvalue 儲存的,如果 rowkey 過長會極大影響 hfile 的儲存效率 memstore 將快取部分資料到記憶體,如果 rowkey 字段過長,記憶體的有效利用率就會降低,系統不能快取更多的資料,這樣會降低檢索效率

3. rowkey 雜湊原則

如果 rowkey 按照時間戳的方式遞增,不要將時間放在二進位製碼的前面,建議將 rowkey 的高位作為雜湊字段,由程式隨機生成,低位放時間字段,這樣將提高資料均衡分布在每個 regionserver,以實現負載均衡的機率。如果沒有雜湊字段,首字段直接是時間資訊,所有的資料都會集中在乙個 regionserver 上,這樣在資料檢索的時候負載會集中在個別的 regionserver 上,造成熱點問題,會降低查詢效率。

這裡所說的加鹽不是密碼學中的加鹽,而是在rowkey的前面增加隨機數,具體就是給rowkey分配乙個隨機字首以使得它和之前的rowkey的開頭不同。分配的字首種類數量應該和你想使用資料分散到不同的region的數量一致。加鹽之後的rowkey就會根據隨機生成的字首分散到各個region上,以避免熱點。

雜湊會使同一行永遠用乙個字首加鹽。雜湊也可以使負載分散到整個集群,但是讀卻是可以**的。使用確定的雜湊可以讓客戶端重構完整的rowkey,可以使用get操作準確獲取某乙個行資料

第三種防止熱點的方法時反轉固定長度或者數字格式的rowkey。這樣可以使得rowkey中經常改變的部分(最沒有意義的部分)放在前面。這樣可以有效的隨機rowkey,但是犧牲了rowkey的有序性。

反轉rowkey的例子

以手機號為rowkey,可以將手機號反轉後的字串作為rowkey,這樣的就避免了以手機號那樣比較固定開頭導致熱點問題

乙個常見的資料處理問題是快速獲取資料的最近版本,使用反轉的時間戳作為rowkey的一部分對這個問題十分有用,可以用long.max_value - timestamp追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通過scan [key]獲得[key]的第一條記錄,因為hbase中rowkey是有序的,第一條記錄是最後錄入的資料。

比如需要儲存乙個使用者的操作記錄,按照操作時間倒序排序,在設計rowkey的時候,可以這樣設計

[userid反轉][long.max_value - timestamp],在查詢使用者的所有操作記錄資料的時候,直接指定反轉後的userid,startrow是[userid反轉][000000000000],stoprow是[userid反轉][long.max_value - timestamp]

如果需要查詢某段時間的操作記錄,startrow是[user反轉][long.max_value - 起始時間],stoprow是[userid反轉][long.max_value - 結束時間]

hbaseconfiguration.

create()

conn = connectionfactory.

createconnection

(conf)

;admin admin = conn.

getadmin()

;htabledescriptor table =

newhtabledescriptor

(tablename.

valueof

(tablename));

table.

addfamily

(columnfamily)

;admin.

createtable

(table)

;table.

delete

(delete)

;table.

getscanner

(scan)

;

與nosql資料庫們一樣,row key是用來檢索記錄的主鍵。只有3中方式:

1 通過單個row key訪問(get訪問單行資料)

2 通過row key的range(訪問某個區間內的rowkey,訪問多行資料)

3 全表掃瞄 (scan訪問全本的資料)

參考

常見面試題

1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...

常見面試題

1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...

常見面試題

dns解析 發起tcp三次握手,並建立tcp連線 發起http請求 伺服器相應http請求並得到html 伺服器解析html 並對頁面進行渲染然後返回給使用者 首先先進行ioc容器的初始化 ioc 容器的初始化過程分為三步驟 resource 定位 beandefinition 的載入和解析,bea...