hbase很有价值的读写性能提升

NoSQL现在风生水起,hbase的使用也越来越广,但目前几乎所有的NoSQL产品在运维上都没法和DB相提并论,在这篇blog中来总结下我们在运维hbase时的一些问题以及解决的方法,也希望得到更多hbase同行们的建议,:)

在运维hbase时,目前我们最为关注的主要是三大方面的状况:
1. Cluster load;
2. 读写;
3. 磁盘空间。

1. Cluster load
集群的load状况直接反映了集群的健康程度,load状况的获取非常容易,直接部署ganglia即可得到,由于hbase以优秀的可伸缩性着称,因此多数情况下load超出接受范围时加机器是一个不错的解决方法,当然,这还和系统的设计和使用hbase的方式有关。
如有出现个别机器load比较高的现象,通常是由于集群使用的不均衡造成,需要进行一定的处理,这个放到读写部分再说吧。

2. 读写
读写方面的信息主要包括了读写的次数以及速度,这个通过ganglia看其实不怎么方便,最好还是自己改造下实现,读写次数反映了集群的使用程度,一般来说需要根据压力测试中形成的报告来设置一个读写次数的阈值,以保护系统的稳定。

读写速度方面主要是显示当前的读写速度状况(当然,也需要有历史的报表),如读写速度是在可接受范围,其实就可以不用过多的关心了,如读写速度不OK的话,则需要进行一定的处理。

如读速度不OK,则需要关注以下几点:
* 集群均衡吗?
集群是否均衡主要需要通过三个方面来判断:各region server的region数是否均衡、table的region是否均衡分布还有就是读请求是否均衡分布。

通常各region server的region数是均衡的,这个是目前hbase master的balance策略来保证的,顶多就是有短暂时间的不均衡现象。
table 的region分布则不一定是均衡的,对于有多个table的情况,完全有可能出现某张表的一堆的region在同一台上的现象,对于这种情况,一种方法 是修改master的balance策略,让其在balance时考虑table的region的balance,我们目前采用的是另外一种方法,提供了 一个界面来手工balance table的region,如果是由于table的region不均衡导致了读速度的不OK,可以采用这种办法解决下。

读 请求是否均衡分布一方面取决于table的region的分布状况,另一方面则取决于应用的使用方法,如table的region分布均衡,读请求仍然不 均衡分布的话,说明应用的请求有热点的状况,如这种状况造成了读速度的不OK,可以手工将region进行拆分,并分配到不同的region server上,这是hbase很简单的一种应对热点的解决方法。

* cache的命中率如何?
cache的命中率目前通过ganglia以及region server的log都不是很好看,因此我们也进行了改造,更直白的显示cache的命中率的变化状况。

如 cache的命中率不高,首先需要看下目前系统用于做LRUBlockcache的大小是不是比较小,这主要靠调整region server启动的-Xmx以及hfile.block.cache.size参数来控制,可通过修改hbase-env.sh,增加export HBASE_REGIONSERVER_OPTS=”-Xmx16g”来单独的调整region server的heap size,如LRUBlockCache已足够大,cache命中率仍然不高的话,则多数情况是由于随机读无热点造成的,这种情况如果要提升cache命 中率的话,就只能靠加机器了。
在cache的使用率上要关注应用对数据的读取方式,经常整行数据读取的适合设计在同一cf里,不经常整行读取的适合设计在多cf里。

* bloomfilter打开了吗?
默 认情况下创建的table是不打开bloomfilter的(可通过describe table来确认,如看到BLOOMFILTER => ‘NONE’则表示未打开),对于随机读而言这个影响还是比较明显的,由于bloomfilter无法在之后动态打开,因此创建表时最好就处理好,方法类 似如此:create ‘t1′, { NAME => ‘f1′, BLOOMFILTER => ‘ROWCOL’ }。

* Compact
在某些特殊的应用场景下,为了保证写速度的平稳,可能会考虑不进行Compact,不进行compact会导致读取数据时需要扫描大量的文件,因此compact还是有必要做的。

* 应用的使用方式
应用在读取数据时是随机读、有热点的随机读还是连续读,这个对读速度也有很大的影响,这个需要结合业务进行分析,总的来说,hbase在随机读上效率还是很一般的,这和它的存储结构有一定关系。
另外,应用在读取时如每次都是读取一行的所有数据的话,schema设计的时候在同一个cf下就比较合适。

如写速度不OK,则需要关注以下几点:
* 集群均衡吗?
除 了和读一样的集群均衡性问题外,还有一个问题是rowKey的设计问题,因为hbase是按rowKey连续存储的,因此如应用写入数据时rowKey是 连续的,那么就会造成写的压力会集中在单台region server上,因此应用在设计rowKey时,要尽可能的保证写入是分散的,当然,这可能会对有连续读需求的场景产生一定的冲击。

* 日志中是否出现过以下信息?
** Flush thread woke up with memory above low water.
日 志中出现这个信息说明有部分写出现过阻塞等待的现象,造成这个现象的原因是各个region的memstore使用的大小加起来超过了总的阈值,于是阻塞 并开始找一个region进行flush,这个过程会需要消耗掉一些时间,通常来说造成这个的原因是单台region server上region数太多了,因此其实单台region server上最好不要放置过多的region,一种调节方法是调大split的fileSize,这样可以适当的减少region数,但需要关注调整后 读性能的变化。

** delaying flush up to
当日志中出现这个信息时,可能会造成出现下面的现象,从而产生影响,这个通常是store file太多造成的,通常可以调大点store file个数的阈值。

** Blocking updates for
当 日志中出现这个信息时,表示写动作已被阻塞,造成这个现象的原因是memstore中使用的大小已超过其阈值的2倍,通常是由于上面的delaying flush up to造成的,或者是region数太多造成的,或者是太多hlog造成的,这种情况下会造成很大的影响,如内存够用的话,可以调大阈值,如其他原因则需要 对症下药。

* split造成的?
split会造成读写短暂的失败,如写的数据比较大的话,可能会有频繁的split出现,对于这种情况主要需要依靠调大split的filesize(hbase.hregion.max.filesize)来控制。

3. 磁盘空间
磁 盘空间可直接通过hdfs的管理界面查看,磁盘空间如占用比较多的话,可以关注下表的压缩是否开启(describe表后,COMPRESSION => ‘NONE’表示未开启),默认是不开启的,在创建表时可create ‘t1′,{NAME => “cf1″,COMPRESSION => “LZO”},如为已经创建的表,则需要先disable、alter、enable后再执行下major_compact,在我们的几个案例中大概能压 缩到原大小的20%–30%,还是很可观的。

如压缩已开启,占用仍然比较多的话,基本就只能增加机器或升级硬盘了,由于hbase需要对每列重复存储rowkey,因此会有一定的空间浪费。

时间: 2024-08-07 00:16:30

hbase很有价值的读写性能提升的相关文章

HBase一次客户端读写异常解读分析与优化全过程(干货)

大数据时代,HBase作为一款扩展性极佳的分布式存储系统,越来越多地受到各种业务的青睐,以求在大数据存储的前提下实现高效的随机读写操作.对于业务方来讲,一方面关注HBase本身服务的读写性能,另一方面也需要更多地关注HBase客户端参数的具体意义.这篇文章就从一个具体的HBase客户端异常入手,定位异常发生的原因以及相应的客户端参数优化. 案发现场 最近某业务在使用HBase客户端读取数据时出现了大量线程block的情况,业务方保留了当时的线程堆栈信息,如下图所示: 看到这样的问题,首先从日志和

HBase读写性能优化

一个系统上线之后,开发和调优将会一直伴随在系统的整个生命周期中,HBase也不例外.下面我们要学习如何进行HBase读写性能调优,以获取最大的读写效率. HBase写入优化客户端优化批量写采用批量写,可以减少客户端到RegionServer之间的RPC的次数,提高写入性能.批量写请求要么全部成功返回,要么抛出异常. HTable.put(List<Put>); 异步批量提交如果业务可以接受异常情况下丢失少量数据,可以使用异步批量提交方式提交请求. 用户提交写请求之后,数据会先写入客户端缓存,并

MySQL如何避免使用Linux的swap分区而提升读写性能

MySQL如何避免使用Linux的swap分区而提升读写性能 Linux有很多很好的内存.IO调度机制,但是并不会适用于所有场景.对于DBA来说Linux比较让人头疼的一个地方是,它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上.对于频繁进行读写操作的系统而言,数据看似在内存而实际上在磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统.这篇blog主要讲讲我们作为DBA,怎样尽量避免MySQL惨遭swap的毒手. 首先我们要了解点基础的东西,比如说为什么会产生sw

HBase最佳实践-读性能优化策略

任何系统都会有各种各样的问题,有些是系统本身设计问题,有些却是使用姿势问题.HBase也一样,在真实生产线上大家或多或少都会遇到很多问题,有些是HBase还需要完善的,有些是我们确实对它了解太少.总结起来,大家遇到的主要问题无非是Full GC异常导致宕机问题.RIT问题.写吞吐量太低以及读延迟较大. Full GC问题之前在一些文章里面已经讲过它的来龙去脉,主要的解决方案目前主要有两方面需要注意,一方面需要查看GC日志确认是哪种Full GC,根据Full GC类型对JVM参数进行调优,另一方

深度学习性能提升的诀窍

深度学习性能提升的诀窍[转载] 原文: How To Improve Deep Learning Performance 作者: Jason Brownlee 提升算法性能的想法 这个列表并不完整,却是很好的出发点.我的目的是给大家抛出一些想法供大家尝试,或许有那么一两个有效的方法.往往只需要尝试一个想法就能得到提升.我把这个列表划分为四块: · 从数据上提升性能 · 从算法上提升性能 · 从算法调优上提升性能 · 从模型融合上提升性能 性能提升的力度按上表的顺序从上到下依次递减.举个例子,新的

Nginx引入线程池,性能提升9倍!

前言 Nginx以异步.事件驱动的方式处理连接.传统的方式是每个请求新起一个进程或线程,Nginx没这样做,它通过非阻塞sockets.epoll.kqueue等高效手段,实现一个worker进程处理多个连接和请求. 一般情况下是一个CPU内核对应一个worker进程,所以worker进程数量固定,并且不多,所以在任务切换上消耗的内存和CPU减少了.这种方式很不错,在高并发和扩展能力等方面都能体现. 看图说话,任务切换不见了. 但是异步事件模式很不喜欢阻塞(blocking).很多第三方模块使用

【阿里云产品公测】利用PTS服务优化网站数据库读写性能

[阿里云产品公测]利用PTS服务优化网站数据库读写性能 作者:阿里云用户千鸟 写这个帖子主要也是因为在用PTS测试网站的时候,手动访问网站进入报错页面,主要原因是数据库连接对象存在问题,导致并发多的时候产生故障,于是简单分析了一下数据库读写的性能优化以及利用PTS的测试结果,整理出来和大家分享一下,顺便参加一下这个活动.        几乎所有的网站都需要数据库来存储网站中的相关信息,因此在网站应用与数据库的交互过程中,数据库数据读取的性能对网站整体的性能是至关重要的. ?      通常我们在

Web性能优化系列:10个JavaScript性能提升的技巧

由 伯乐在线 - Delostik 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:jonraasch.com.欢迎加入翻译小组. Nicholas Zakas是一位 JS 大师,Yahoo! 首页的前端主程.他是<高性能 Javascript>的作者,这本书值得每个程序员去阅读. 当谈到 JS 性能的时候,Zakas差不多就是你要找的,2010年六月他在Google Tech Talk发表了名为<Speed Up Your Javascript>的演讲. 但 Javascrip

如何利用缓存机制实现JAVA类反射性能提升30倍

一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> 分享者:宜信支付结算部支付研发团队高级工程师陶红 原文首发于宜信支付结算技术团队公号:野指针 在实际工作中的一些特定应用场景下,JAVA类反射是经常用到.必不可少的技术,在项目研发过程中,我们也遇到了不得不运用JAVA类反射技术的业务需求,并且不可避免地面临这个技术固有的性能瓶颈问题. 通过近两年的研究.尝