51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

HBase 优化常见手段

1)减少调整

减少调整这个如何理解呢?HBase 中有几个内容会动态调整,如 region(分区)、HFile,
所以通过一些方法来减少这些会带来 I/O 开销的调整
Region
如果没有预建分区的话,那么随着 region 中条数的增加,region 会进行分裂,这将增加 I/O
开销,所以解决方法就是根据你的 RowKey 设计来进行预建分区,减少 region 的动态分裂
HFile
HFile 是数据底层存储文件,在每个 memstore 进行刷新时会生成一个 HFile,当 HFile 增加
到一定程度时,会将属于一个 region 的 HFile 进行合并,这个步骤会带来开销但不可避免,
但是合并后 HFile 大小如果大于设定的值,那么 HFile 会重新分裂。为了减少这样的无谓的
I/O 开销,建议估计项目数据量大小,给 HFile 设定一个合适的值
2)减少启停

数据库事务机制就是为了更好地实现批量写入,较少数据库的开启关闭带来的开销,那么
HBase 中也存在频繁开启关闭带来的问题。

关闭 Compaction,在闲时进行手动 Compaction
因为 HBase 中存在 Minor Compaction 和 Major Compaction,也就是对 HFile 进行合并,所
谓合并就是 I/O 读写,大量的 HFile 进行肯定会带来 I/O 开销,甚至是 I/O 风暴,所以为了
避免这种不受控制的意外发生,建议关闭自动 Compaction,在闲时进行 compaction
批量数据写入时采用 BulkLoad
如果通过 HBase-Shell 或者 JavaAPI 的 put 来实现大量数据的写入,那么性能差是肯定并且
还可能带来一些意想不到的问题,所以当需要写入大量离线数据时建议使用 BulkLoad
3)减少数据量

虽然我们是在进行大数据开发,但是如果可以通过某些方式在保证数据准确性同时减少数据
量,何乐而不为呢?
开启过滤,提高查询速度
开启 BloomFilter,BloomFilter 是列族级别的过滤,在生成一个 StoreFile 同时会生成一个
MetaBlock,用于查询时过滤数据
使用压缩:一般推荐使用 Snappy 和 LZO 压缩
4)合理设计
在一张 HBase 表格中 RowKey 和 ColumnFamily 的设计是非常重要,好的设计能够提高性能
和保证数据的准确性
RowKey 设计:应该具备以下几个属性
散列性:散列性能够保证相同相似的 rowkey 聚合,相异的 rowkey 分散,有利于查询
简短性:rowkey 作为 key 的一部分存储在 HFile 中,如果为了可读性将 rowKey 设计得过长,
那么将会增加存储压力
唯一性:rowKey 必须具备明显的区别性业务性:举些例子
假如我的查询条件比较多,而且不是针对列的条件,那么 rowKey 的设计就应该支持多条件
查询
如果我的查询要求是最近插入的数据优先,那么 rowKey 则可以采用叫上 Long.Max-时间戳
的方式,这样 rowKey 就是递减排列
列族的设计
列族的设计需要看应用场景
多列族设计的优劣
优势:HBase 中数据时按列进行存储的,那么查询某一列族的某一列时就不需要全盘扫描,
只需要扫描某一列族,减少了读 I/O;其实多列族设计对减少的作用不是很明显,适用于读
多写少的场景
劣势:降低了写的 I/O 性能。原因如下:数据写到 store 以后是先缓存在 memstore 中,同
一个 region 中存在多个列族则存在多个 store,每个 store 都一个 memstore,当其实
memstore 进行 flush 时,属于同一个 region
的 store 中的 memstore 都会进行 flush,增加 I/O 开销

赞(4)
未经允许不得转载:工具盒子 » HBase 优化常见手段