以下為使用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...