Full GC问题之前在一些文章里面已经讲过它的来龙去脉,主要的解决方案目前主要有两方面需要注意,一方面需要查看GC日志确认是哪种Full GC,根据Full GC类型对JVM参数进行调优,另一方面需要确认是否开启了BucketCache的offheap模式,建议使用LRUBlockCache的童鞋尽快转移到BucketCache来。

HBase最佳实践-读功能优化战略(hbase读性能优化)  HBase 优化 策略 第1张

任何体系都会有各式各样的问题,有些是体系自身规划问题,有些却是运用姿态问题。HBase也相同,在实在出产线上咱们或多或少都会遇到许多问题,有些是HBase还需求完善的,有些是咱们的确对它了解太少。总结起来,咱们遇到的首要问题无非是Full GC反常导致宕机问题、RIT问题、写吞吐量太低以及读推迟较大。

Full GC问题之前在一些文章里边现已讲过它的来龙去脉,首要的解决方案现在首要有两方面需求留意,一方面需求查看GC日志承认是哪种Full GC,依据Full GC类型对JVM参数进行调优,另一方面需求承认是否敞开了BucketCache的offheap形式,主张运用LRUBlockCache的童鞋赶快转移到BucketCache来。当然咱们仍是很等待官方2.0.0版别发布的更多offheap模块。

RIT问题,我信任更多是由于咱们对其不了解,详细原理能够戳 这儿 ,解决方案现在有两个,优先是运用官方供给的HBCK进行批改(HBCK自己一向想拿出来共享,可是现在事例还不多,等后边有更多事例的话再拿出来说),运用之后仍是解决不了的话就需求手动批改文件或许元数据表。

而关于写吞吐量太低以及读推迟太大的优化问题,笔者也和许多朋友进行过讨论,这篇文章就以读推迟优化为核心内容翻开,详细分析HBase进行读推迟优化的那些套路,以及这些套路之后的详细原理。期望咱们在看完之后能够结合这些套路分析自己的体系。

一般情况下,读恳求推迟较大一般存在三种场景,别离为:

1. 仅有某事务推迟较大,集群其他事务都正常

2. 整个集群一切事务都反映推迟较大

3. 某个事务起来之后集群其他部分事务推迟较大

这三种场景是表象,一般某事务反响推迟反常,首要需求清晰详细是哪种场景,然后针对性解决问题。下图是对读优化思路的一点总结,首要分为四个方面:客户端优化、服务器端优化、列族规划优化以及HDFS相关优化,下面每一个小点都会依照场景分类,文章***进行概括总结。下面别离进行详细解说:

HBase最佳实践-读功能优化战略(hbase读性能优化)  HBase 优化 策略 第2张

HBase客户端优化

和大大都体系相同,客户端作为事务读写的进口,姿态运用不正确一般会导致 本事务读推迟较高 实践上存在一些运用姿态的引荐用法,这儿一般需求重视四个问题:

1. scan缓存是否设置合理?

优化原理:在解说这个问题之前,首要需求解说什么是scan缓存,一般来讲一次scan会回来许大都据,因而客户端主张一次scan恳求,实践并不会一次就将一切数据加载到本地,而是分红屡次RPC恳求进行加载,这样规划一方面是由于许大都据恳求或许会导致网络带宽严峻耗费从而影响其他事务,另一方面也有或许由于数据量太大导致本地客户端发生OOM。在这样的规划体系下用户会首要加载一部分数据到本地,然后遍历处理,再加载下一部分数据到本地处理,如此往复,直至一切数据都加载完结。数据加载到本地就存放在scan缓存中,默许100条数据巨细。

一般情况下,默许的scan缓存设置就能够正常作业的。可是在一些大scan(一次scan或许需求查询几万乃至几十万行数据)来说,每次恳求100条数据意味着一次scan需求几百乃至几千次RPC恳求,这种交互的价值无疑是很大的。因而能够考虑将scan缓存设置增大,比方设为500或许1000就或许愈加适宜。笔者之前做过一次实验,在一次scan扫描10w+条数据量的条件下,将scan缓存从100增加到1000,能够有用下降scan恳求的整体推迟,推迟根本下降了25%左右。

优化主张:大scan场景下将scan缓存从100增大到500或许1000,用以削减RPC次数

2. get恳求是否能够运用批量恳求?

优化原理:HBase别离供给了单条get以及批量get的API接口,运用批量get接口能够削减客户端到RegionServer之间的RPC连接数,进步读取功用。别的需求留意的是,批量get恳求要么成功回来一切恳求数据,要么抛出反常。

优化主张:运用批量get进行读取恳求

3. 恳求是否能够显现指定列族或许列?

优化原理:HBase是典型的列族数据库,意味着同一列族的数据存储在一同,不同列族的数据分隔存储在不同的目录下。假定一个表有多个列族,只是依据Rowkey而不指定列族进行检索的话不同列族的数据需求独立进行检索,功用必定会比指定列族的查询差许多,许多情况下乃至会有2倍~3倍的功用丢失。

优化主张:能够指定列族或许列进行准确查找的尽量指定查找

4. 离线批量读取恳求是否设置制止缓存?

优化原理:一般离线批量读取数据会进行一次性全表扫描,一方面数据量很大,另一方面恳求只会履行一次。这种场景下假定运用scan默许设置,就会将数据从HDFS加载出来之后放到缓存。可想而知,许大都据进入缓存必将其他实时事务热门数据挤出,其他事务不得不从HDFS加载,从而会形成显着的读推迟毛刺

优化主张:离线批量读取恳求设置禁用缓存,scan.setBlockCache(false)

HBase服务器端优化

一般服务端端问题一旦导致事务读恳求推迟较大的话,一般是集群等级的,即整个集群的事务都会反映读推迟较大。能够从4个方面下手:

1. 读恳求是否均衡?

优化原理:极点情况下假定一切的读恳求都落在一台RegionServer的某几个Region上,这一方面不能发挥整个集群的并发处理才能,另一方面必定形成此台RegionServer资源严峻耗费(比方IO耗尽、handler耗尽等),落在该台RegionServer上的其他事务会因而遭到很大的涉及。可见,读恳求不均衡不只会形成自身事务功用很差,还会严峻影响其他事务。当然,写恳求不均衡也会形成相似的问题,可见负载不均衡是HBase的大忌。

调查承认:调查一切RegionServer的读恳求QPS曲线,承认是否存在读恳求不均衡现象

优化主张:RowKey有必要进行散列化处理(比方MD5散列),一同建表有必要进行预分区处理

2. BlockCache是否设置合理?

优化原理:BlockCache作为读缓存,关于读功用来说至关重要。默许情况下BlockCache和Memstore的装备相对比较均衡(各占40%),能够依据集群事务进行批改,比方读多写少事务能够将BlockCache占比调大。另一方面,BlockCache的战略挑选也很重要,不同战略对读功用来说影响并不是很大,可是对GC的影响却适当明显,特别BucketCache的offheap形式下GC体现很优胜。别的,HBase 2.0对offheap的改造(HBASE-11425)将会使HBase的读功用得到2~4倍的进步,一同GC体现会更好!

调查承认:调查一切RegionServer的缓存未***率、装备文件相关装备项一级GC日志,承认BlockCache是否能够优化

优化主张:JVM内存装备量 < 20G,BlockCache战略挑选LRUBlockCache;不然挑选BucketCache战略的offheap形式;等待HBase 2.0的到来!

3. HFile文件是否太多?

优化原理:HBase读取数据一般首要会到Memstore和BlockCache中检索(读取最近写入数据&热门数据),假定查找不到就会到文件中检索。HBase的类LSM结构会导致每个store包括大都HFile文件,文件越多,检索所需的IO次数必定越多,读取推迟也就越高。文件数量一般取决于Compaction的履行战略,一般和两个装备参数有关:HBase.hstore.compactionThreshold和hbase.hstore.compaction.max.size,前者表明一个store中的文件数超越多少就应该进行兼并,后者表明参数兼并的文件巨细***是多少,超越此巨细的文件不能参加兼并。这两个参数不能设置太’松’(前者不能设置太大,后者不能设置太小),导致Compaction兼并文件的实践效果不显着,从而许多文件得不到兼并。这样就会导致HFile文件数变多。

调查承认:调查RegionServer等级以及Region等级的storefile数,承认HFile文件是否过多

优化主张:hbase.hstore.compactionThreshold设置不能太大,默许是3个;设置需求依据Region巨细承认,一般能够简略的以为hbase.hstore.compaction.max.size = RegionSize / hbase.hstore.compactionThreshold

4. Compaction是否耗费体系资源过多?

优化原理:Compaction是将小文件兼并为大文件,进步后续事务随机读功用,可是也会带来IO扩大以及带宽耗费问题(数据长途读取以及三副本写入都会耗费体系带宽)。正常装备情况下Minor Compaction并不会带来很大的体系资源耗费,除非由于装备不合理导致Minor Compaction过分频频,或许Region设置太大情况下发生Major Compaction。

调查承认:调查体系IO资源以及带宽资源运用情况,再调查Compaction行列长度,承认是否由于Compaction导致体系资源耗费过多

优化主张:

(1)Minor Compaction设置:hbase.hstore.compactionThreshold设置不能太小,又不能设置太大,因而主张设置为5~6;hbase.hstore.compaction.max.size = RegionSize / hbase.hstore.compactionThreshold

(2)Major Compaction设置:大Region读推迟灵敏事务( 100G以上)一般不主张敞开主动Major Compaction,手动低峰期触发。小Region或许推迟不灵敏事务能够敞开Major Compaction,但主张约束流量;

(3)等待更多的优异Compaction战略,相似于stripe-compaction尽早供给安稳服务

HBase列族规划优化

HBase列族规划对读功用影响也至关重要,其特点是只影响单个事务,并不会对整个集群发生太大影响。列族规划首要从两个方面查看:

1. Bloomfilter是否设置?是否设置合理?

优化原理:Bloomfilter首要用来过滤不存在待检索RowKey或许Row-Col的HFile文件,防止无用的IO操作。它会告知你在这个HFile文件中是否或许存在待检索的KV,假定不存在,就能够不必耗费IO翻开文件进行seek。很显然,经过设置Bloomfilter能够进步随机读写的功用。

Bloomfilter取值有两个,row以及rowcol,需求依据事务来承认详细运用哪种。假定事务大大都随机查询只是运用row作为查询条件,Bloomfilter一定要设置为row,不然假定大大都随机查询运用row+cf作为查询条件,Bloomfilter需求设置为rowcol。假定不承认事务查询类型,设置为row。

优化主张:任何事务都应该设置Bloomfilter,一般设置为row就能够,除非承认事务随机查询类型为row+cf,能够设置为rowcol

HDFS相关优化

HDFS作为HBase终究数据存储体系,一般会运用三副本战略存储HBase数据文件以及日志文件。从HDFS的视点望上层看,HBase便是它的客户端,HBase经过调用它的客户端进行数据读写操作,因而HDFS的相关优化也会影响HBase的读写功用。这儿首要重视如下三个方面:

1. Short-Circuit Local Read功用是否敞开?

优化原理:当时HDFS读取数据都需求经过DataNode,客户端会向DataNode发送读取数据的恳求,DataNode接遭到恳求之后从硬盘中将文件读出来,再经过TPC发送给客户端。Short Circuit战略答应客户端绕过DataNode直接读取本地数据。(详细原理参阅 此处 )

优化主张:敞开Short Circuit Local Read功用,详细装备戳 这儿

2. Hedged Read功用是否敞开?

优化原理:HBase数据在HDFS中一般都会存储三份,并且优先会经过Short-Circuit Local Read功用测验本地读。可是在某些特别情况下,有或许会呈现由于磁盘问题或许网络问题引起的短时间本地读取失利,为了应对这类问题,社区开发者提出了补偿重试机制 – Hedged Read。该机制根本作业原理为:客户端主张一个本地读,一旦一段时间之后还没有回来,客户端将会向其他DataNode发送相同数据的恳求。哪一个恳求先回来,另一个就会被丢掉。

优化主张:敞开Hedged Read功用,详细装备参阅 这儿

3. 数据本地率是否太低?

数据本地率:HDFS数据一般存储三份,假定当时RegionA处于Node1上,数据a写入的时分三副本为(Node1,Node2,Node3),数据b写入三副本是(Node1,Node4,Node5),数据c写入三副本(Node1,Node3,Node5),能够看出来一切数据写入本地Node1必定会写一份,数据都在本地能够读到,因而数据本地率是100%。现在假定RegionA被搬迁到了Node2上,只要数据a在该节点上,其他数据(b和c)读取只能长途跨节点读,本地率就为33%(假定a,b和c的数据巨细相同)。

优化原理:数据本地率太低很显然会发生许多的跨网络IO恳求,必定会导致读恳求推迟较高,因而进步数据本地率能够有用优化随机读功用。数据本地率低的原因一般是由于Region搬迁(主动balance敞开、RegionServer宕机搬迁、手动搬迁等),因而一方面能够经过防止Region无故搬迁来坚持数据本地率,另一方面假定数据本地率很低,也能够经过履行major_compact进步数据本地率到100%。

优化主张:防止Region无故搬迁,比方封闭主动balance、RS宕机及时拉起并迁回飘走的Region等;在事务低峰期履行major_compact进步数据本地率

HBase读功用优化概括

在本文开端的时分说到读推迟较大无非三种常见的表象,单个事务慢、集群随机读慢以及某个事务随机读之后其他事务遭到影响导致随机读推迟很大。了解完常见的或许导致读推迟较大的一些问题之后,咱们将这些问题进行如下归类,读者能够在看到现象之后在对应的问题列表中进行详细定位:

HBase最佳实践-读功能优化战略(hbase读性能优化)  HBase 优化 策略 第3张

HBase最佳实践-读功能优化战略(hbase读性能优化)  HBase 优化 策略 第4张

HBase最佳实践-读功能优化战略(hbase读性能优化)  HBase 优化 策略 第5张

HBase读功用优化总结

功用优化是任何一个体系都会遇到的论题,每个体系也都有自己的优化方法。 HBase作为分布式KV数据库,优化点又分外不同,更多得融入了分布式特性以及存储体系优化特性。文中总结了读优化的根本突破点,有什么不对的当地还望纠正,有弥补的也能够一同讨论沟通!

转载请说明出处
知优网 » HBase最佳实践-读功能优化战略(hbase读性能优化)

发表评论

您需要后才能发表评论