對提高HBase寫效能的一些思考

2021-07-05 08:05:27 字數 1085 閱讀 7438

以下為使用hbase一段時間的三個思考,由於在記憶體充足的情況下hbase能提供比較滿意的讀效能,因此寫效能是思考的重點。希望讀者提出不同意見討論

1 autoflush=false的影響

2 hbase.hregion.max.filesize應該設定多少合適

hbase中hfile的預設最大值(hbase.hregion.max.filesize)是256mb,而google的bigtable**中對tablet的最大值也推薦為100-200mb,這個大小有什麼秘密呢? 

眾所周知hbase中資料一開始會寫入memstore,當memstore滿64mb以後,會flush到disk上而成為storefile。當storefile數量超過3時,會啟動compaction過程將它們合併為乙個storefile。這個過程中會刪除一些timestamp過期的資料,比如update的資料。而當合併後的storefile大小大於hfile預設最大值時,會觸發split動作,將它切分成兩個region。 

lz進行了持續insert壓力測試,並設定了不同的hbase.hregion.max.filesize,根據結果得到如下結論:值越小,平均吞吐量越大,但吞吐量越不穩定;值越大,平均吞吐量越小,吞吐量不穩定的時間相對更小。

為什麼會這樣呢?推論如下:

3 從效能的角度談table中family和qualifier的設定

對於傳統關係型資料庫中的一張table,在業務轉換到hbase上建模時,從效能的角度應該如何設定family和qualifier呢? 

最極端的,可以每一列都設定成乙個family,也可以只有乙個family,但所有列都是其中的乙個qualifier,那麼有什麼區別呢? 

family越多,那麼獲取每乙個cell資料的優勢越明顯,因為io和網路都減少了,而如果只有乙個family,那麼每一次讀都會讀取當前rowkey的所有資料,網路和io上會有一些損失。 

當然如果要獲取的是固定的幾列資料,那麼把這幾列寫到乙個family中比分別設定family要更好,因為只需一次請求就能拿回所有資料。 

以上是從讀的方面來考慮的,那麼寫呢?可以參考一下這篇文章: 

提高hive效能的一些hiveql的建議

1,streamtable 標識哪張是大表,有利於查詢優化器 和 mapjoin 類似的優化 2,hive建立索引減少mapreduce輸入的資料量 3,explain可以解釋hiveql的語句 3,半連線semi join 在map端過濾掉不會參加join操作的資料,就可以大大節省網路i o 選取...

整理一些提高C 程式設計效能的技巧

1 使用stringbuilder代替使用string 連線符 說明 string類物件是不可變的 唯讀 一旦建立該物件,就不能修改該物件的值。物件string物件的重新賦值,本質上是重新建立了乙個string物件並將新的值賦值給該物件。如果字串存在較多次的拼接時候,最後使用stringbuilde...

整理一些提高C 程式設計效能的技巧

1 使用stringbuilder代替使用string 連線符 說明 string類物件是不可變的 唯讀 一旦建立該物件,就不能修改該物件的值。物件string物件的重新賦值,本質上是重新建立了乙個string物件並將新的值賦值給該物件。如果字串存在較多次的拼接時候,最後使用stringbuilde...