HBase–調優篇

1. 表的設計數據庫

1.1 提早建立多個Region
默認狀況下,在建立HBase表的時候會自動建立一個Region分區,當導入數據的時候,全部的HBase客戶端都向這一個Region寫數據,直到這個Region足夠大了才進行切分。一種能夠加快批量寫入速度的方法是經過預先建立一些空的Regions,這樣當數據寫入HBase時,會按照Region分區狀況,在集羣內作數據的負載均衡。數組


1.2 Row Key設計
HBase中row key用來檢索表中的記錄,支持如下三種方式:
(1) 經過單個RowKey訪問:即按照某個RowKey鍵值進行Get操做;
(2) 經過RowKey的Range進行Scan:即經過設置Start RowKey和End RowKey,在這個範圍內進行掃描;
(3) 全表掃描:即直接掃描整張表中全部行記錄。
在HBase中,RowKey能夠是任意字符串,最大長度64KB,實際應用中通常爲10~100bytes,存爲byte[]字節數組,通常設計成定長的。
RowKey是按照字典序存儲,所以,設計RowKey時,要充分利用這個排序特色,將常常一塊兒讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。
舉個例子:若是最近寫入HBase表中的數據是最可能被訪問的,能夠考慮將時間戳做爲RowKey的一部分,因爲是字典序排序,因此可使用Long.MAX_VALUE – timestamp做爲RowKey,這樣能保證新寫入的數據在讀取時能夠被快速命中。緩存


1.3 Column Family設計
不要在一張表裏定義太多的column family。目前Hbase並不能很好的處理超過2~3個Column family的表。由於某個Column Family在Flush的時候,它鄰近的Column Family也會因關聯效應被觸發Flush,最終致使系統產生更多的I/O。網絡

 
1.4 In Memory設置(可選)
建立表的時候,能夠經過HColumnDescriptor.setInMemory(true)將表放到RegionServer的緩存中,保證在讀取的時候被cache命中。session

  
1.5 版本限制
建立表的時候,能夠經過HColumnDescriptor.setMaxVersions(int maxVersions)設置表中數據的最大版本,對於一些不是特別重要的數據,能夠設置setMaxVersions(1)。app

  
1.6 數據生命週期限制
建立表的時候,能夠經過HColumnDescriptor.setTimeToLive(int timeToLive)設置表中數據的存儲生命期,過時數據將自動被刪除,例如若是隻須要存儲最近兩天的數據,那麼能夠設置setTimeToLive(2 * 24 * 60 * 60)。負載均衡

 

1.7 Compact 和Split(可選)性能

實際應用中,若是有必要能夠手動觸發Compact和split。優化

 

1.8 採用壓縮(可選).net

壓縮須要根據實際業務和機器性能來衡量是否要採用犧牲CPU來換取存儲上的節約,而且能節省I/O和網絡開銷,可使用Lzo或Snappy壓縮的方式,大體能夠壓縮4~5倍。

  

2. 讀取

2.1 掃描緩存

在進行掃描時能夠設置一次讀取多條,緩存數據,減小I/O開銷。代碼實現:

hTable.setScannerCaching(50); // 參數50表示一次性掃描50條

  

2.2 掃描指定列

Scan時指定須要的Column Family,能夠減小網絡傳輸數據量,不然默認scan操做會返回整行全部Column Family的數據。

  

2.3 釋放資源

經過scan取完數據後,記得要關閉ResultScanner,不然RegionServer可能會出現問題(對應的Server資源沒法釋放)。

  

3. 寫入優化 

3.1 寫入緩存

寫入HBase表的時候最好不要一條一條的寫,採用批量的方式,在代碼裏設置:

hTable.setAutoFlush(false, false); // 不讓hbase自動刷新數據到數據庫
hTable.setWriteBufferSize(1024 * 1024 * 10);// 緩存大小10M

當緩存的數據達到10M的時候會觸發flush操做,另外當hTable.flushCommits();或hTable.close();時也會flush數據到數據庫中。並且Hbase的API中支持數據已list的方式插入。

 

4. 參數優化

4.1 鏈接時間

參數:zookeeper.session.timeout
RegionServer與Zookeeper間的鏈接超時時間,默認值:3分鐘(180000ms),咱們配置:300000ms(5min)。

  

4.2 線程數控制

參數:hbase.regionserver.handler.count
RegionServer的請求處理IO線程數,默認值:10,咱們配置:200。
 

4.3 split閾值

參數:hbase.hregion.max.filesize
單個region觸發split的大小閾值,默認值:256M,咱們配置:4G。
 

4.4 開啓mslab方案

參數:hbase.hregion.memstore.mslab.enabled
減小因內存碎片致使的Full GC,提升總體性能,默認值:true。
 

4.5 掃描緩存

參數:hbase.client.scanner.caching
scanner調用next方法一次獲取的數據條數,默認值:1。
 

4.6 MemStore大小控制

參數:hbase.regionserver.global.memstore.upperLimit/lowerLimit
hbase.regionserver.global.memstore.upperLimit :防止memstore來不及flush成storefile,堆積對內存佔用過大,當某region的全部memstore佔用大於40%,hbase會強制block全部的更新(請求)並flush這些memstore釋放內存。
hbase.regionserver.global.memstore.lowerLimit 默認值就能夠,不用調。

 

更多精彩內容,請訪問:圈裏圈外

相關文章
相關標籤/搜索