请列举几个 高性能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 开销。 |
蓝海大脑 京ICP备18017748号-1