背景

Hbase是一个写多读少应用场景的Kv数据库,自然Hbase的读写性能使我们非常关注的,本文就简单记录下影响客户端读写性能的一些注意事项

客户端读性能优化

1.客户端scan的时候数据量很大时其实需要和RegionServer进行多次通信,为了减少和RegionServer通信的次数,可以设置每次和RegionServer通信时获取的记录的数量,默认为100,比如可以设置为200或者更多,此外,如果是scan获取大量的数据,比如几十万甚至几百万,那么需要考虑是否禁用服务端缓存,也就是这些扫描出来的数据是否放置到服务端的BlockCache中,如果把这些数据都放在服务端的BlockCache的话,会挤掉真正热点的数据,造成服务端其他应用的读延迟.
2.指定列簇或者列进行查找操作,由于Hbase是根据列簇进行目录存放数据的,如果不指定列簇进行查找,hbase会返回这个rowkey对应的所有列簇的数据,如果有多个列簇时,相当于IO会扩大几倍,所以客户端查询时最好精确指定到列簇或者列的维度.

客户端写性能优化

1.Put操作使用批量异步提交模式,也就是如果可以容许少量的记录丢失,我们可以使用异步批量提交的模式,也就是先把记录提交到客户端本地内存中,等达到一定阈值比如2M之后再把这些记录提交到RegionServer服务器中,这样可以提高吞吐和降低延迟
2.Put操作是否需要WAL同步落盘操作,我们对hbase的一次更新操作对应的Hbase那里就是一次WAL日志写入HLog + 写MemStore本地内存,此处影响最大的是WAL记录如何写入HLog,因为这涉及到文件IO,而且这里涉及到HDFS的三个副本的文件IO操作,对写性能影响很大,这里Hbase提供几种WAL同步写入HLog的方式,一种是SKIP_WAL,直接不把变更日志写到HLog中,这种方式对写入性能最好,然而宕机时会造成大量的记录丢失。第二种是ASYNC_WAL,采用这种方式,hbase会使用异步线程把更新日志写到Hlog中,但是只是写入到Hdfs的操作系统缓存中,不保证数据落盘到Hlog文件. 第三种是SYNC_WAL,这种方式会同步将变更记录写入到HLog中,但是数据只是写入到Hdfs操作系统的缓存中,不保证落盘,比异步写入的优势在于异步写入是如果RS宕机,会丢失数据,而同步写入时RS宕机不会丢失数据,只有HDFS的DN节点宕机才会丢失数据
第四种FSYNC_WAL,采用这种方式变更记录会同步写入Hdfs中,并且强制使用fsync命令同步数据到DameNode的本地磁盘,严格保证数据不会丢失,然而性能较差,所以如果可以容许记录的少量丢失,采用Sync_WAL是一个比较好兼容了性能和数据安全性的方案