HBase 優化主要有四大方法:預分區、RowKey設計、記憶體優化、基礎優化
1、預分區
每一個region維護着startRow與endRowKey,如果加入的資料符合某個region維護的rowKey範圍,則該資料交給這個region維護。那麼依照這個原則,我們可以将資料所要投放的分區提前大緻的規劃好,以提高HBase性能。
- 手動設定預分區
- 生成16進制序列預分區
-
按照檔案中設定的規則預分區
在Hbase解壓縮目錄中建立splits.txt檔案内容如下:
然後執行:aaaa bbbb cccc dddd
- 使用Java API建立預分區
TableDescriptorBuilder td = TableDescriptorBuilder.newBuilder(TableName.valueOf(tn)); for ( String cf : cfs ) { final ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(cf)); td.setColumnFamily(columnFamilyDescriptorBuilder.build()); } byte[][] bss = new byte[2][]; String r1 = "a"; String r2 = "b"; bss[0] = Bytes.toBytes(r1); bss[1] = Bytes.toBytes(r2); admin.createTable(td.build(),bss);
2、RowKey設計
一條資料的唯一辨別就是rowkey,類似于關系型資料庫的主鍵。在HBase中,rowkey是有序的。由于HBase存在分區的概念,是以當存儲資料時,這條資料存儲于哪個分區,就取決于rowkey處于哪一個預分區的區間内。
設計rowkey的主要目的 ,就是讓資料均勻的分布于所有的region中,在一定程度上防止資料傾斜。接下來我們就談一談rowkey常用的設計方案。
-
生成随機數、hash、散列值
原本rowKey為1001的,SHA1後變成:
原本rowKey為3001的,SHA1後變成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7
原本rowKey為5001的,SHA1後變成:49042c54de64a1e9bf0b33e00245660ef92dc7bd
在做此操作之前,一般我們會選擇從資料集中抽取樣本,來決定什麼樣的rowKey來Hash後作為每個分區的臨界值。7b61dec07e02c188790670af43e717f0f46e8913
- 字元串反轉
20170524000001轉成10000042507102 20170524000002轉成20000042507102
- 字元串拼接
20170524000001_a12e 20170524000001_93i7
3、記憶體優化
HBase操作過程中需要大量的記憶體開銷,畢竟Table是可以緩存在記憶體中的,但是不建議配置設定非常大的堆記憶體,因為GC過程持續太久會導緻RegionServer處于長期不可用狀态,一般16~36G記憶體就可以了,如果因為架構占用記憶體過高導緻系統記憶體不足,架構一樣會被系統服務拖死。
4、基礎優化
-
Zookeeper會話逾時時間
hbase-site.xml
屬性:zookeeper.session.timeout
解釋:預設值為90000毫秒(90s)。當某個RegionServer挂掉,90s之後Master才能察覺到。可适當減小此值,以加快Master響應,可調整至600000毫秒。
-
設定RPC監聽數量
hbase-site.xml
屬性:hbase.regionserver.handler.count
解釋:預設值為30,用于指定RPC監聽的數量,可以根據用戶端的請求數進行調整,讀寫請求較多時,增加此值。
-
手動控制Major Compaction
hbase-site.xml
屬性:hbase.hregion.majorcompaction
解釋:預設值:604800000秒(7天), Major Compaction的周期,若關閉自動Major Compaction,可将其設為0
-
優化HStore檔案大小
hbase-site.xml
屬性:hbase.hregion.max.filesize
解釋:預設值10737418240(10GB),如果需要運作HBase的MR任務,可以減小此值,因為一個region對應一個map任務,如果單個region過大,會導緻map任務執行時間過長。該值的意思就是,如果HFile的大小達到這個數值,則這個region會被切分為兩個Hfile。
-
優化HBase用戶端緩存
hbase-site.xml
屬性:hbase.client.write.buffer
解釋:預設值2097152bytes(2M)用于指定HBase用戶端緩存,增大該值可以減少RPC調用次數,但是會消耗更多記憶體,反之則反之。一般我們需要設定一定的緩存大小,以達到減少RPC次數的目的。
-
指定scan.next掃描HBase所擷取的行數
hbase-site.xml
屬性:hbase.client.scanner.caching
解釋:用于指定scan.next方法擷取的預設行數,值越大,消耗記憶體越大。
-
BlockCache占用RegionServer堆記憶體的比例
hbase-site.xml
屬性:hfile.block.cache.size
解釋:預設0.4,讀請求比較多的情況下,可适當調大
-
MemStore占用RegionServer堆記憶體的比例
hbase-site.xml
屬性:hbase.regionserver.global.memstore.size
解釋:預設0.4,寫請求較多的情況下,可适當調大