提升HBase实时读数据效率
操作场景
需要提升读取HBase数据性能的场景。
前提条件
调用HBase的get或scan接口,从HBase中实时读取数据。
操作步骤
- 读数据服务端调优
参数入口:登录FusionInsight Manager,选择“集群 > 服务 > 配置 > 全部配置”,进入HBase服务参数“全部配置”界面,配置以下相关参数以提升HBase读数据性能。
如果同时存在读和写的操作,这两种操作的性能会互相影响。如果写入导致的flush和compaction操作频繁发生,会占用大量的磁盘IO操作,从而影响读取的性能。如果写入导致阻塞较多的compaction操作,就会出现Region中存在多个HFile的情况,从而影响读取的性能。所以如果读取的性能不理想的时候,也要考虑写入的配置是否合理。
- 读数据客户端调优
Scan数据时需要设置caching(一次从服务端读取的记录条数,默认是1),如果使用默认值读性能会降到极低。
当不需要读一条数据所有的列时,需要指定读取的列,以减少网络IO。
只读取RowKey时,可以为Scan添加一个只读取RowKey的filter(FirstKeyOnlyFilter或KeyOnlyFilter)。
- 读数据表设计调优
在hbase shell中设置以下表相关参数,以提升实时读HBase数据性能。
表2 影响实时读数据相关参数 配置参数
描述
默认值
COMPRESSION
配置数据的压缩算法,这里的压缩是HFile中block级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目的。
说明:并非所有数据都可以进行有效压缩。例如一张图片的数据,因为图片一般已经是压缩后的数据,所以压缩效果有限。常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。
NONE
BLOCKSIZE
配置HFile中block块的大小,不同的block块大小,可以影响HBase读写数据的效率。越大的block块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。
如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。单位:字节。
65536
DATA_BLOCK_ENCODING
配置HFile中block块的编码方法。当一行数据中存在多列时,一般可以配置为“FAST_DIFF”,可以有效地节省数据存储的空间,从而提供性能。
NONE