HBase的性能优化

数据预分区

主要针对初建表时只有一个region,若是写入的数据量比较大就会致使所在的region server不堪重负,写入性能低下。shell

create 'test', {NAME => 'cf', COMPRESSION => 'SNAPPY'}, SPLITS => ['10','20','30']
复制代码

Rowkey设计

  1. 明确查询条件数据库

    Hbase基本能够当作一个keyvalue数据库,其中的数据须要经过key来查找,所以须要把查询条件拼接成key,将必需的条件放在前面,其余的放在后面。markdown

  2. 热点问题app

    全部的方法都会改变原始数据的存储顺序,所以须要针对不一样的场景采起适合于查询的方法。性能

    主要有3个方法来避免热点现象,分别是反转,加盐和哈希。优化

  • 反转: 把固定长度或者数字格式的 rowkey进行反转,反转分为通常数据反转和时间戳反转,其中以时间戳反转较常见。 缺点: 利于Get操做,但不利于Scan操做,由于数据在原RowKey上的天然顺序已经被打乱。 好比须要保存一个用户的操做记录,就能够按照操做时间倒序排序,在设计rowkey的时候,能够这样设计 反转后的userId,在查询用户的全部操做记录数据的时候,直接指定反转后的userId,startRow 是 反转后的userId,stopRow 是 反转后的userId。若是须要查询某段时间的操做记录,startRow 是[反转后的userId[Long.Max_Value - 起始时间], stopRow 是反转后的userId。
  • 加盐: 在原RowKey的前面添加固定长度的随机数,也就是给RowKey分配一个随机前缀使它和以前的RowKey的开头不一样
  • 哈希: 基于RowKey的完整或部分数据进行Hash,然后将哈希后的值完整替换或部分替换原RowKey的前缀部分。 与加盐类似只不过不是随机数,而是能够预知的一个数

代码优化

  1. 批量读取/写入spa

    • get时可传List,减小rpc调用的次数。设计

    • scan时可加大cache数(默认为100),使每次rpc操做取回更多的数据。code

    scan.setCaching(500)orm

  2. 只取须要的列

    在列较多的状况下使用QualifierFilter,减小传回客户端的数据量。

磁盘占用

  1. Rowkey、列族名称和列名称在知足需求的状况下尽可能短一点,由于每一个cell都包含这些信息,在数据量大的状况下能够显著节省磁盘空间。
  2. 建表时采用snappy压缩
相关文章
相关标签/搜索