Pora2应用中HBase高并发读写性能优化

标签: 分布式技术 性能优化 | 发表时间:2014-03-21 17:47 | 作者:毅行
出处:http://www.searchtb.com

淘宝搜索的个性化离线实时分析系统Pora已升级至Pora2,Pora2是在基于Yarn的流式计算框架IStream基础上开发的,同时为保证数据和消息的实时处理系统中较多地使用了HBase,是一个典型的高并发读写HBase的分布式应用。

系统在发布之初遇到了比较严重的性能问题,表现为处理速度跟不上实时日志,并且整个Hadoop/HBase集群压力大,连带其它应用受影响。经过排查发现问题主要都出现在了对HBase的使用上,现将遇到的几个典型的使用HBase的问题总结如下,希望能为其它类似应用正确使用HBase提供参考。

HBase的Periodic Flusher

从系统的各种统计指标分析,系统主要慢在了读写HBase的环节,观察HBase日志发现每个RegionServer都在频繁地flush和compact。分析后发现当前hbase版本里有一个Periodic Flusher的机制,memstore中的数据如果持续一段时间没有flush的话hbase会自动触发flush,这个时间间隔默认是1小时。了解了一下这是hbase 0.94.8以后引入的新feature,初衷是防止有些memstore长时间不flush,在没有开启wal且遇到region server挂掉时导致数据丢失。

由于我们的 hbase每个region server有将近100个region,几乎每分钟都有region因为达到一小时的时间间隔触发flush,而多数情况下每次flush的文件都很小,flush次数多了之后又会引起compaction,如此频繁的flush和compaction使得region server处理速度明显变慢。在我们将这个配置调整为10小时后,可以从下图中看到hbase flush queue size和fs pread latency都有明显变小。

alt alt

注:个人觉得hbase的这个新feature应用场景很有限,实在不应该作为一个默认开启的配置,建议可以通过配置直接禁用。​

​不间断的频繁scan对region server造成较大压力

​​Pora2采用了一个基于HBase实现的消息队列Hqueue,下游使用方通过读这个消息队列,第一时间获取最新的消息进行处理。

读消息的过程相当于一次Scan,在一开始的Pora2版本中我们未对读Hqueue的频率进行控制,导致某些读HQueue的worker不停地发起新的Scan,即便Hqueue数据已经读完,仍会立刻重新创建Scan,而这个Scan会因为读不到数据很快结束之后又重新创建。这样不停地新建Scanner对Region Server端构成了不小的且是不必要的压力。

发现这个问题后我们修改了这部分程序代码,在读完数据后sleep几秒后再重新scan。

​在修改完hbase的配置并且加上读Hqueue的scan频率控制后,Pora2情况明显好转,但处理累积数据时的速度还是不够快。

​超大并发下的hbase问题

从统计指标上分析,系统还是慢在访问hbase上,访问hbase的日志中不时出现各种TimeOutException也可以说明这一点。跟踪日志中某些频繁报超时的regionserver发现,有些region server日志持续报以下异常:

alt

所在机器连接数很多,但load很低,而一旦pora2停了,这些现象就会很快消失。

从这一现象分析判断是Pora2对HBase的并发连接数太多了,使得region server的handler不够用,server端还没来得及处理请求,client端已经到了超时时间而断开。

为此我们大幅度减少了访问hbase的进程数以减少对hbase的并发连接,为了不降低处理能力,在进程内部使用更多的处理线程。由于线程间是共享对hbase的连接的,所以增加线程数不会增加对hbase的连接数。

通过这一调整,很大程度缓解了hbase region server的压力。

避免HBase访问热点

在作了较多优化改进后发现仍有几个worker比较慢,跟踪那几个慢的worker日志发现读HBase经常超时,找到超时的region server,从HMaster UI上观察到这个server的读写请求数明显是其它server的好几倍。开始怀疑是数据有倾斜,有热点region落到了这台机器上。在HBase UI上逐个检查Pora2用到的HBase表,果然在其中的一张表上发现它的第一个region的请求数比其它region高出一两个数量级。

按我们的设计预期,这个表的rowkey是加了hash前缀的,理论上不该有热点region,最终检查代码后才发现是生成rowkey的代码存在bug,生成前缀的代码用了 key.hashCode() % regionNum,结果有很多key的hashcode返回是负数,使得很多前缀是负数,全都落在了第一个region上。

而对hbase来说,一旦有一个region有热点,就会导致该region所在的region server变慢,进而使得这个server上其它表的region访问也慢,从而影响了整个hbase的性能。

Bulk load数据的Major Compaction

调查中还发现了一个Bulk load数据未执行Major Compaction引起的问题。

我们有一张表的数据是每天定时从HDFS中Bulk load到HBase里的,而且这张表的数据是只读的。结果几天下来后,因为没有数据写入,不会触发任何compaction,而每天都有新的HFile被Load进来,导致每个region下的HFile数越来越多,最终拖慢了这张表的读取性能。

发现问题后我们在每天的Bulk load结束后对这个表执行一次Major Compaction,有效解决了问题。

总结

高并发读写HBase的应用需要尽量保证对HBase的合理使用,不合理的使用有可能会导致某一个region server甚至整个hbase集群的性能出现问题,而hbase的性能问题又反过来使得所有应用性能下降,此时如果应用选择继续加大对hbase的并发访问,甚至有可能因此陷入一个性能继续变差的恶性循环。

相关 [pora2 应用 hbase] 推荐:

Pora2应用中HBase高并发读写性能优化

- - 搜索技术博客-淘宝
淘宝搜索的个性化离线实时分析系统Pora已升级至Pora2,Pora2是在基于Yarn的流式计算框架IStream基础上开发的,同时为保证数据和消息的实时处理系统中较多地使用了HBase,是一个典型的高并发读写HBase的分布式应用. 系统在发布之初遇到了比较严重的性能问题,表现为处理速度跟不上实时日志,并且整个Hadoop/HBase集群压力大,连带其它应用受影响.

HBASE高级应用

- - 数据库 - ITeye博客
基本原则是尽量把查询的维度或信息存入行健中,因为这样筛选数据的效率最高. 从表的形式看,主要有列少行多的高表和行多列少的宽表,一般情况下高表更有优势,因为hbase只能按行拆分. 防止数据过热:当时间序列类型的数据(行健为时间戳)写入时,数据集中在一个region中,很容易产生读写热点. 解决办法有:1)添加hash前缀,2)字段交换或提升权重:即在行键中添加另外一个字段或交换杭建中多个字段的位置,3)随机化,比如对整个行健取MD5,作为新的行健.

Hypertable应用实践:比肩HBase

- - 技术改变世界 创新驱动中国 - 《程序员》官网
Hypertable是一个开源、高性能、可伸缩的数据库,采用与Google的BigTable相似的模型. BigTable让用户可以通过一些主键来组织海量数据,并实现高效的查询. Hypertable和HBase分别是BigTable的两个开源实现:HBase主要使用Java语言开发,而Hypertable使用Boost C++,另外在一些细节的设计理念上也有所不同.

hbase两个典型应用实例

- - CSDN博客推荐文章
本文介绍hbase的两个典型应用实例OpenTSDB和地理信息系统. 学习一种技术最好的办法就是了解一个正在使用的应用系统是如何应用这种技术来解决问题的. 其中开源的OPenTSDB数据监控系统就是应用hbase解决数据存储的. 同时hbase还能很好的应对地理信息系统(GIS)中的两个挑战:大规模数据处理的延迟和空间位置建模.

HBase的一些应用设计tip

- - BlogJava_首页
1,对于HBase的存储设计,要考虑它的存储结构是:rowkey+columnFamily:columnQualifier+timestamp(version)+value = KeyValue in HBase,一个KeyValue依次按照rowkey,columnkey和timestamp有序.

HBASE在QIHOO 360搜索中的应用

- - 开源软件 - ITeye博客
【CSDN现场报道】中国IT界技术盛会——Hadoop与大数据技术大会(Hadoop&BigData Technology Conference 2012,HBTC 2012)于2012年11月30日-12月1日在北京新云南皇冠假日酒店隆重召开. 本次大会以“大数据共享与开放技术”为主题,聚焦于Hadoop与大 数据,力邀数十位国内外Hadoop及大数据技术应用的产学界人士和实践企业,探讨大数据技术生态系统的现状和发展趋势,并围绕Hadoop与大数据热点 技术和应用实践进行深入解析.

HBase 核心原理与应用场景

- -
HBase是大数据NoSQL领域里非常重要的分布式KV数据库,是一个高可靠、高性能、高伸缩的分布式存储系统,目前国内知名公司都有在大规模使用,社区也非常活跃. 本文就是学习HBase的敲门砖,主要从以下几个方面解读HBase. HBase是Google的BigTable的开源实现,底层存储引擎是基于LSM-Tree数据结构设计的.

HBase在淘宝的应用和优化小结

- - NoSQLFan
本文来自于NoSQLFan联合作者@ koven2049,他在淘宝从事Hadoop及HBase相关的应用和 优化. 对Hadoop、HBase都有深入的了解,本文就是其在工作中对HBase的应用优化小结,分享给大家. 原文地址: http://walkoven.com/?p=57. 文章PDF下载: http://walkoven.com/hbase:optimization and apply summary in taobao.pdf.

使用常用工具测试HBase应用

- - CSDN博客云计算推荐文章
虽然业界采用Apache HBase来构建终端用户应用的范围越来越多,但是许多这种应用并没有经过良好的测试. 通过这篇文章,你可以了解到有关这方面的一些容易实现的测试方法. 我们首先以 JUnit为例, 然后是 Mockito 和 Apache MRUnit, 接着会使用HBase的一个微型集群来做集成测试.

理解Hadoop-Hbase原理与应用小结

- - 数据库 - ITeye博客
首先Hbase中的一个“元素”是由行键、列族名、限定符、时间戳唯一标识的并且行键作为数据行在表里的唯一标识,我们只有通过行键来访问列族别无他法. 修改数据:我们先找到要修改的行键把新的数据记录追加到对应的列族中并打上一个新时间戳代表最新版本. 删除数据:插入带有删除标记的行进入,相当于把整个行键所在的行删了.