hbase雖然能提供海量資料的實時讀寫,但是一旦資料量非常大,查詢延遲也會非常高,所以要做好優化工作。
1、列族越少越好
(1)列族(cf)數量,在記憶體結構中乙個cf對應乙個store區域,乙個store中又存在多個storefile小檔案,小storefile是不斷合併新的大的storefile,資料量大了,storefile自然會多,合併任務也自然增多,會降低效能,增加列族效能會更有甚之。
(2)由於資料的備份、遷移、合併等操作都是基於列族層面進行的。列族少,也會減少資料備份、遷移、合併過程中記憶體、磁碟io的耗時。
(3)每個列族讀寫次數不一樣,假設a列族資料量很大,b列族資料量較小, 當a列族,memstore資料達到閥值時候,就會flush到磁碟中,這時會帶動b列族的memstore重新整理到記憶體中,導致b列族頻繁flush,增加不必要的磁碟io操作。
2、引數設定
把in_memory 設定為true,開啟記憶體快取,預設為false
rowkey即行健,相當於一級索引,根據業務需要,設計合理可以大大提高hbase查詢效率
1、均勻分布
rowkey盡量要短,寫入要分散,分布均勻,根據業務合理設定預分割槽,避免熱點寫
常見的有加隨機數、hash計算、反轉
(1)隨機數俗稱加salt,就是在rowkey前加隨機數,如下,在前邊新增a、b、c....之類的隨機數。
rowkey
salt_rowkey
15738862581
a_15738862581
15837456185
b_15837456185
15837456189
c_15837456189
這種rowkey設計可以均勻分布在各個region中,但是它打亂了自然的字典排序,是不利於scan的
(2)hash計算 計算rowkey的hash值,並取前n位與原rowkey拼接
rowkey
hash_rowkey
15738862581
2f5f2eb_15738862581
15837456175
cb4ght_15837456175
15837456159
eh4kj3_15837456159
這種rowkey一定程度均勻分布rowkey,對單個隨機查詢效率較高,但是也是不利於我們scan的
(3)反轉就是將一段長度或者全部長度的rowkey進行倒序,如下將後四位反轉後拼接
rowkey
reverse_rowkey
15738862581
1852_573886
15837456175
5716_583745
15837456159
9516_1583745
這種打亂了rowkey,犧牲了行排序
2、儲存設計
場景:查詢使用者所有訂單,使用者查詢每個月的訂單按時間由近及遠排序,及時間倒序
這是我們就要利用hbase rowkey的字典排序特性來合理設計rowkey,以提高查詢速度。由於每個查詢都是基於某個使用者的時間倒序。所以這裡rowkey的設計使用者id+時間戳timestamp來作為rowkey,這樣乙個使用者的訂單資訊就會連續儲存在一起,查詢效率自然提高。如id=10000001,timestamp=1536425757188,rowkey=10000001_1536425757188。這樣rowkey是使乙個使用者的訂單連續分布一起了,但是時間正序,不符合倒序要求。因此要進一步優化,這時我們只需timestamp倒序就行了,用乙個大數減去timestamp,timestamp=9223370500429018619=long.max-1536425757188 ,rowkey=10000001_9223370500429018619 如這樣時間同乙個使用者最近的訂單就排在最前面了。
rowkey:uid_(long.max-timestamp),防止熱點也可以加salt,salt_uid_(long.max-timestamp)
儲存主要**如下:
public static void addonerecord()throws exception
查詢主要**如下:
public void queryall throws exception
}
3、巧用過濾器
假設使用者的訂單有四個狀態,1 待支付、2代發貨、3待收貨、 4已完成,使用者要查詢待發貨的訂單,這時要用到過濾器,減少查詢量,提高查詢速度
public void query() throws exception
}
1、引數調優 暫不了解待完成
2、jvm調優 暫不了解待完成
Hbase效能優化
1 表的設計 1.1 pre creating regions 預設情況下,在建立hbase表的時候會自動建立乙個region分割槽,當匯入資料的時候,所有的hbase客戶端都向這乙個region寫資料,直到這個region足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先建立一些空的re...
Hbase效能優化
以下為使用hbase一段時間的幾個思考,由於在記憶體充足的情況下hbase能提供比較滿意的讀效能,因此寫效能是思考的重點。希望讀者提出不同意見討論 1 autoflush false 2 hbase.hregion.max.filesize hbase中hfile的預設最大值 hbase.hregi...
hbase資料讀取優化 HBase效能優化 總結篇
1 hbase.hregion.max.filesize應該設定多少合適 預設值 256m 說明 maximum hstorefile size.if any one of a column families hstorefiles has?grown to exceed this value,th...