HBase在生產中的RowKey設計

2021-09-26 07:47:47 字數 3293 閱讀 9116

在使用hbase時,對於表設計時,有兩點設計至關重要:列簇的設計和rowkey的設計。

列簇設計:

原則:在合理的範圍內能盡量少的減少列簇就減少列簇

最優的設計:將所有相關性很強的key-value都放在同乙個列簇下,這樣的話就既能做到查詢效率最高,也能保證盡可能少的訪問不同的磁碟檔案(因為乙個store儲存乙個列簇,當有多個列簇時就代表有多個store)。

以使用者資訊為例,可以將必須的基本資訊存放在乙個列簇,而一些附加的額外資訊可以放在另乙個列簇。

rowkey設計:

在hbase中,表會被劃分為n個region,被託管在regionserver中,而region有兩個重要的屬性:startkey和endkey,表示這個region維護的rowkey的範圍,當我們要讀/寫資料的時候,如果rowkey落在某乙個region的start-end key的範圍內,那麼就可以快速定為到哪個region並且讀/寫相關的資料了,

如何快速的定位到我們想要的資料,就在於我們rowkey的設計了!

rowkey的設計三原則:

1、rowkey的長度原則:

rowkey 是乙個二進位製碼流,rowkey 的長度被很多開發者建議說設計在 10~100 個位元組,不過建議是越短越好,不要超過 16 個位元組;

原因如下:

<1>、資料的持久化檔案 hfile 中是按照 keyvalue 儲存的,如果 rowkey 過長比如 100 個位元組,1000 萬列資料光 rowkey 就要占用 100*1000 萬=10 億個位元組,將近 1g 資料,這會極大影響hfile 的儲存效率;

<2>、memstore 將快取部分資料到記憶體,如果 rowkey 字段過長記憶體的有效利用率會降低,系統將無法快取更多的資料,這會降低檢索效率。因此 rowkey 的位元組長度越短越好;

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

2、rowkey的雜湊原則:

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

3、rowkey的唯一原則:

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

資料熱點:

hbase 中的行是按照 rowkey 的字典順序排序的,這種設計優化了 scan 操作,可以將相關的行以及會被一起讀取的行訪問在臨近位置,便於 scan。然而糟糕的 rowkey 設計是熱點的源頭。 熱點發生在大量的 client 直接訪問集群的乙個或極少數個節點(訪問可能是讀,寫或者其他操作)。大量訪問會使熱點 region 所在的單個機器超出自身承受能力,引起效能下降甚至 region 不可用,這也會影響同乙個 regionserver 上的其他 region,由於主機無法服務其他 region 的請求,設計良好的資料訪問模式以使集群被充分,均衡的利用,為了避免寫熱點,設計rowkey使不同行在同乙個region,但是在更多資料情況下,資料應該被寫入集群的多個 region,而不是乙個。也就是說,資料熱點問題提高了讀效率,但是降低了寫的效率。

防止資料熱點的有效措施:

1、加鹽:

這裡所說的加鹽不是密碼學中的加鹽,而是在 rowkey 的前面增加隨機數,具體就是給rowkey 分配乙個隨機字首以使得它和之前的 rowkey 的開頭不同。分配的字首種類數量應該和你想使用資料分散到不同的 region 的數量一致。加鹽之後的 rowkey 就會根據隨機生成的字首分散到各個 region 上,以避免熱點。也就是想分散到50個region上時,就對rowkey的字首新增1-50的隨機數,就可以保證資料是均勻的分散到這50個region上的,但是這樣就會造成相鄰的資料scan時還會訪問其他的region上的資料,降低了讀效能,而且對單條資料的get無法進行查詢,因為已經不知道rowkey的具體值了,對後期單條記錄的查詢方面有很大障礙,這種方法僅僅解決了資料儲存及寫資料效能問題。

2、雜湊:

雜湊會使同一行永遠用乙個字首加鹽。雜湊也可以使負載分散到整個集群,但是讀卻是可以**的。使用確定的雜湊可以讓客戶端重構完整的 rowkey,可以使用 get 操作準確獲取某乙個行資料,這種方式解決了上述加鹽方法的缺陷,但是卻犧牲了rowkey帶來的排序效能

3、反**

第三種防止熱點的方法是反轉固定長度或者數字格式的 rowkey。這樣可以使得 rowkey中經常改變的部分(最沒有意義的部分)放在前面。這樣可以有效的隨機 rowkey,但是犧牲了 rowkey 的有序性。反轉 rowkey 的例子以手機號為 rowkey,可以將手機號反轉後的字串作為 rowkey,這樣的就避免了以手機號那樣比較固定開頭導致熱點問題,而且也可以使用get操作準確的獲取某一行資料。

4、時間戳反**

乙個常見的資料處理問題是快速獲取資料的最近版本,使用反轉的時間戳作為 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 - 結束時間]

在生產中使用金絲雀部署來進行測試

考慮到a b 測試和預防性 pre emptive 效能測試,一旦克服了 金絲雀部署 所涉及的技術挑戰將可以減少部署流程中的風險。a b 測試允許在不改變大多數使用者的使用者體驗的情況下進行對新功能的測試。而效能測試對於整個使用者群體來說同樣只會產生微不足道的影響。根據nolio的 金絲雀部署 該方...

pcb過孔漏銅 為什麼PCB板在生產中會銅線脫落?

pcb在生產加工過程中,常常會遇到一些工藝問題,例如 pcb線路板的銅線脫落不良,這樣就會影響pcb的品質。那麼影響這些的因素有哪些呢?一 pcb生產加工因素 1 銅箔蝕刻過度,市場上使用的電解銅箔一般為單面鍍鋅及單面鍍銅,常見的甩銅一般為70um以上的鍍鋅銅箔,紅化箔及18um以下灰化箔基本都未出...

pcb過孔漏銅 為什麼PCB板在生產中會銅線脫落?

pcb在生產加工過程中,常常會遇到一些工藝問題,例如 pcb線路板的銅線脫落不良,這樣就會影響pcb的品質。那麼影響這些的因素有那些呢?一 pcb生產加工因素 1 銅箔蝕刻過度,市場上使用的電解銅箔一般為單面鍍鋅及單面鍍銅,常見的甩銅一般為70um以上的鍍鋅銅箔,紅化箔及18um以下灰化箔基本都未出...