Hbase查詢效能優化

2021-08-26 20:27:34 字數 2325 閱讀 1148

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...