天天看點

HBase 優化之四大法寶

HBase 優化主要有四大方法:預分區、RowKey設計、記憶體優化、基礎優化

1、預分區

每一個region維護着startRow與endRowKey,如果加入的資料符合某個region維護的rowKey範圍,則該資料交給這個region維護。那麼依照這個原則,我們可以将資料所要投放的分區提前大緻的規劃好,以提高HBase性能。

  1. 手動設定預分區
  2. 生成16進制序列預分區
  3. 按照檔案中設定的規則預分區

    在Hbase解壓縮目錄中建立splits.txt檔案内容如下:

    aaaa
    bbbb
    cccc
    dddd
               
    然後執行:
  4. 使用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常用的設計方案。

  1. 生成随機數、hash、散列值

    原本rowKey為1001的,SHA1後變成:

    dd01903921ea24941c26a48f2cec24e0bb0e8cc7

    原本rowKey為3001的,SHA1後變成:

    49042c54de64a1e9bf0b33e00245660ef92dc7bd

    原本rowKey為5001的,SHA1後變成:

    7b61dec07e02c188790670af43e717f0f46e8913

    在做此操作之前,一般我們會選擇從資料集中抽取樣本,來決定什麼樣的rowKey來Hash後作為每個分區的臨界值。
  2. 字元串反轉
    20170524000001轉成10000042507102
    20170524000002轉成20000042507102
               
  3. 字元串拼接
    20170524000001_a12e
    20170524000001_93i7
               

3、記憶體優化

HBase操作過程中需要大量的記憶體開銷,畢竟Table是可以緩存在記憶體中的,但是不建議配置設定非常大的堆記憶體,因為GC過程持續太久會導緻RegionServer處于長期不可用狀态,一般16~36G記憶體就可以了,如果因為架構占用記憶體過高導緻系統記憶體不足,架構一樣會被系統服務拖死。

4、基礎優化

  1. Zookeeper會話逾時時間

    hbase-site.xml

    屬性:zookeeper.session.timeout

    解釋:預設值為90000毫秒(90s)。當某個RegionServer挂掉,90s之後Master才能察覺到。可适當減小此值,以加快Master響應,可調整至600000毫秒。

  2. 設定RPC監聽數量

    hbase-site.xml

    屬性:hbase.regionserver.handler.count

    解釋:預設值為30,用于指定RPC監聽的數量,可以根據用戶端的請求數進行調整,讀寫請求較多時,增加此值。

  3. 手動控制Major Compaction

    hbase-site.xml

    屬性:hbase.hregion.majorcompaction

    解釋:預設值:604800000秒(7天), Major Compaction的周期,若關閉自動Major Compaction,可将其設為0

  4. 優化HStore檔案大小

    hbase-site.xml

    屬性:hbase.hregion.max.filesize

    解釋:預設值10737418240(10GB),如果需要運作HBase的MR任務,可以減小此值,因為一個region對應一個map任務,如果單個region過大,會導緻map任務執行時間過長。該值的意思就是,如果HFile的大小達到這個數值,則這個region會被切分為兩個Hfile。

  5. 優化HBase用戶端緩存

    hbase-site.xml

    屬性:hbase.client.write.buffer

    解釋:預設值2097152bytes(2M)用于指定HBase用戶端緩存,增大該值可以減少RPC調用次數,但是會消耗更多記憶體,反之則反之。一般我們需要設定一定的緩存大小,以達到減少RPC次數的目的。

  6. 指定scan.next掃描HBase所擷取的行數

    hbase-site.xml

    屬性:hbase.client.scanner.caching

    解釋:用于指定scan.next方法擷取的預設行數,值越大,消耗記憶體越大。

  7. BlockCache占用RegionServer堆記憶體的比例

    hbase-site.xml

    屬性:hfile.block.cache.size

    解釋:預設0.4,讀請求比較多的情況下,可适當調大

  8. MemStore占用RegionServer堆記憶體的比例

    hbase-site.xml

    屬性:hbase.regionserver.global.memstore.size

    解釋:預設0.4,寫請求較多的情況下,可适當調大