您好,登錄后才能下訂單哦!
小編給大家分享一下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命中。
1.5 版本限制
創建表的時候,可以通過HColumnDescriptor.setMaxVersions(int maxVersions)設置表中數據的最大版本,對于一些不是特別重要的數據,可以設置setMaxVersions(1)。
1.6 數據生命周期限制
創建表的時候,可以通過HColumnDescriptor.setTimeToLive(int timeToLive)設置表中數據的存儲生命期,過期數據將自動被刪除,例如如果只需要存儲最近兩天的數據,那么可以設置setTimeToLive(2 * 24 * 60 * 60)。
1.7 Compact 和Split(可選)
實際應用中,如果有必要可以手動觸發Compact和split。
1.8 采用壓縮(可選)
壓縮需要根據實際業務和機器性能來衡量是否要采用犧牲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 默認值就可以,不用調。
以上是“HBase如何調優”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。