干货:HBase实践之读性能优化策略

完整GC问题之前在一些文章里面已经讲过它的来龙去脉,主要的解决方案目前主要有两方面需要注意,一方面需要查看GC日志确认是哪种GC,根据完整GC类型对JVM参数进行调优,另一方面需要确认是否开启了BucketCache的offheap模式,建议使用LRUBlockCache的童鞋尽快转移到BucketCache来。当然我们还是很期待官方2.0.0版本发布的更多offheap模块。

罗切斯特理工学院的航拍问题,我相信更多是因为我们对其不了解,具体原理可以戳这里,解决方案目前有两个,优先是使用官方提供的HBCK进行修复(HBCK本人一直想拿出来分享,但是目前案例还不多,等后面有更多案例的话再拿出来说),使用之后还是解决不了的话就需要手动修复文件或者元数据表。而对于写吞吐量太低以及读延迟太大的优化问题,笔者也和很多朋友进行过探讨,这篇文章就以读延迟优化为核心内容展开,具体分析HBase进行读延迟优化的那些套路,以及这些套路之后的具体原理。希望大家在看完之后能够结合这些套路剖析自己的系统。

一般情况下,读请求延迟较大通常存在三种场景,分别为:

1。仅有某业务延迟较大,集群其他业务都正常;

2。整个集群所有业务都反映延迟较大;

3。某个业务起来之后集群其他部分业务延迟较大。

这三种场景是表象,通常某业务反应延迟异常,首先需要明确具体是哪种场景,然后针对性解决问题。下图是对读优化思路的一点总结,主要分为四个方面:客户端优化,服务器端优化,列族设计优化以及HDFS相关优化、下面每一个小点都会按照场景分类,文章最后进行归纳总结。下面分别进行详细讲解:

干货:HBase实践之读性能优化策略”> <br/> </p> <p> </p> <p>和大多数系统一样,客户端作为业务读写的入口,姿势使用不正确通常会导致本业务读延迟较高实际上存在一些使用姿势的推荐用法,这里一般需要关注四个问题:</p> <p> </p> <p>优化原理:在解释这个问题之前,首先需要解释什么是扫描缓存,通常来讲一次扫描会返回大量数据,因此客户端发起一次扫描请求,实际并不会一次就将所有数据加载到本地,而是分成多次RPC请求进行加载,这样设计一方面是因为大量数据请求可能会导致网络带宽严重消耗进而影响其他业务,另一方面也有可能因为数据量太大导致本地客户端发生伯父。在这样的设计体系下用户会首先加载一部分数据到本地,然后遍历处理,再加载下一部分数据到本地处理,如此往复,直至所有数据都加载完成。数据加载到本地就存放在扫描缓存中,默认100条数据大小。</p> <p>通常情况下,默认的扫描缓存设置就可以正常工作的。但是在一些大扫描(一次扫描可能需要查询几万甚至几十万行数据)来说,每次请求100条数据意味着一次扫描需要几百甚至几千次RPC请求,这种交互的代价无疑是很大的,因此可以考虑将扫描缓存设置增大,比如设为500或1000者就可能更加合适。笔者之前做过一次试验,在一次扫描扫描10 w +条数据量的条件下,将扫描缓存从100增加到1000,可以有效降低扫描请求的总体延迟,延迟基本降低了25%左右。欢迎加入大数据学习交流分享群:658558542,,一起吹水交流学习(?点击即可加入群聊)</p> <p>优化建议:大扫描场景下将扫描缓存从100增大到500年或1000年者,用以减少RPC次数。</p> <p> </p> <p>优化原理:HBase分别提供了单条得到以及批量得到的API接口,使用批量得到接口可以减少客户端到RegionServer之间的RPC连接数,提高读取性能。另外需要注意的是,批量得到请求要么成功返回所有请求数据,要么抛出异常。</p> <p>优化建议:使用批量得到进行读取请求。</p> <p> </p> <p>优化原理:HBase是典型的列族数据库,意味着同一列族的数据存储在一起,不同列族的数据分开存储在不同的目录下。如果一个表有多个列族,只是根据Rowkey而不指定列族进行检索的话不同列族的数据需要独立进行检索、性能必然会比指定列族的查询差很多,很多情况下甚至会有2倍~ 3倍的性能损失。欢迎加入大数据学习交流分享群:658558542,,一起吹水交流学习(?点击即可加入群聊)</p> <p>优化建议:可以指定列族或者列进行精确查找的尽量指定查找</p> <p> </p> <p>优化原理:通常离线批量读取数据会进行一次性全表扫描,一方面数据量很大,另一方面请求只会执行一次。这种场景下如果使用扫描默认设置,就会将数据从HDFS加载出来之后放到缓存。可想而知,大量数据进入缓存必将其他实时业务热点数据挤出,其他业务不得不从HDFS加载,进而会造成明显的读延迟毛刺<h2 class=干货:HBase实践之读性能优化策略