结合场景的HBase性能分析

阅读: 评论:0

2024年2月8日发(作者:)

结合场景的HBase性能分析

oud Computing云计算 结合场景的H B ase性能分析 文,邓明鉴 在实际应用中,有很多细节能极大地影响HBase的性能。本文结合具体的应用场景对HBase的性能进行分 析,指出了影响其性能的具体细节和解决方法。 1O0 HBase是一个分布式、可扩展的基于HDFS的大数 据存储产品,可用于拥有海量数据的在线服务。 目前,Facebook、Adobe、eBay、Yahoo!和3Witter 等国外大公司都在使用它。国内起步相对较晚, 因为不少人在做系统选型时对性能比较看重。我 认为作为一个平台级产品,性能确实很重要,但 它并不是一两个简单的Benchmark可以说清楚 的,结合具体应用场景的分析更贴近实际应用。 关tBenchmark N 0 SQL产品吸引人的地方通常是它们的 Benchmark,因为它们的单机TPS可以远远超过 关系型数据库,而且很多NoSQL产品都能够做 水平扩展。但我们在追求高TPS的同时也容易 走入一些误区,其中最重要的误区是没有分清 Benchmark所针对的应用场景。虽然很多产品的 Benchmark数!据看上去很高,但一到实际应用场 景中性能就上不去或者不能满足需求。造成这一 现象的原因就是实际应用中需要针对应用来设计 不同的参数,而不同的参数对性能的影响大不相 同。另外,不同的数据对性能的影响也需要考虑。 一般来说,实际应用场景通常是在项目开发时由 PM或PD评估出来的,包括以下这些情况。 ・有多少热点数据?缓存命中率大约是多少。 _读写比例如何。 -单条数据大小大约是多少,有多少列。 _数据需要保存多久,总体数据有多大。 _随机访问还是顺序访问。 -单连接还是多连接,批量请求还是单次请求。 ・是否需要跨机房访问。 -是否会出现瓶颈在客户端的情况。 _索弓『大,J、。 _数据是否需要打开wAI.。 ・对响应时间的要求。 以上是一些常见的场景,还有一些是针对产品的 特殊场景,主要是依据存储产品的自身原理来总 结。比如,对HBase来说,数据是用3个备份因子 还是2个,compact ̄[bplit是否可以关闭,等等。 图1展示了一些我们用过的性能测试场景,供各位 参考。 小结:在具体应用场景中做测试,得到的测试结 果通常和理论值差距非常大,所以产品标明的 Benchmark通常只能做一个参考,我们必须详细 分析它为什么能达 ̄ljBenchmark[ 数据,然后再 结合自身的应用做进一步的判断。 吞吐量和响应时间 对在线产品来说,衡量性能通常体现在两方面: 足够高的吞吐量和足够短的响应延时。足够高的 

Cloud Computing云计算 表1性能数据 ldv=5Obyte/lOObyte随机读 client线程数 1cflq 20 lcflq 50 lcflq 10O lcflq 200 Qps 34606 42446 50372 647O3 Response time(ms) O.57 1_27 1.98 3.09 datablockcache实际命中率 100% 100% 100% 100% ∞0 ■舢,壤 0t¨ _l0赣 ¨牲■瀚t 0# u啦MI雌 ∞‘ ●堆麓音壤l球 j白m I 白自h 盘■■ ∞0REsTtl 翊l∞RE 蚓* 吞吐量意味着系统能承受更高的并发,足够短的 响应延时则意味着单次响应时间足够短。两者通 常需要一个折中。比如,我们在对HBase O 90做读 压力测试时,得到了表1中的一组性能数据。 简单说明一下,lcflq的意思是value体现为一个 ColumnFamily,并且只有1个qualifier。这是最简 单的情况。客户端使用5台机器,第二行标明了 每个客户端使用多少线程并发读取。最后一行的 datablockcache区别于HBase日志中的命中率,它 是数据的命中率,排除掉了bloomfilter的命中率 (实际上bloomfilter的命中率很高,会造成命中率 看起来很高的假像)。 从表1可以看出,随着吞吐量的上升,响应时间也 在增加,但并不是一个反比关系。对在线服务来 说,响应时间通常有个最大接受值,所以可以先 确定最大可接受的响应时间,然后在这个范围内 尽可能多地提高吞吐量。 在吞吐量不大时,由于排除了排队、锁等因素,所 以响应时间可以达到理论值。 对HBase来说,写响应时间通常在2ms以内。原因 是每次写操作的顺序是先写WAL再写memstore, 都成功则返回给客户端,由于memstore是本地的 内存操作,响应时间在微秒级,可以忽略不计,因 此时间主要消耗在客户端与服务器之间的RPC通 信和写WAL上。客户端与服务器的RPC次数通常 只有一个来回,除非需要重新location(1ocation 的RPC次数上限为3次,通常1次就够了)。而写 WAL ̄IJ是执行datanode的pipeline复制过程,顺序 地往本机及另外两台datanode上写数据,再顺序 ack回来。这个过程伴随着5次顺序的RPC调用。 而在每台datanode上写数据则是一个顺序写的 过程(hlog的append是顺序写),并且通过撰作 系统的pagecache来缓冲,因此写数据本身的时 间是非常快的,接近内存操作的速度。因此,整 个写响应的理论时间为6~9次RPC调用的时间, 按0 1~O.2ms的RPC时间计算,写响应时间通常 <2ms。 读响应时间则完全取决于命中率,如表1所示,内 存命中率为100%时,响应时间最短可为0 57mS, 如果是单线程会更快。内存完全命中时,响应 时间就是1~3次RPC的请求时间。而内存不命中 时,响应时间就取决于I/O次数了。从原理上讲, HBase一次读操作所需要的I/0如下。 . _读取每个storefile的checksum文件,判断文件是 否完整。 _读取每个storefile的bloomfilter,判断数据是否 在该文件中。 -如果bloomfilter为真,则读取该storefile的 blockindex,来找到对应的block。 _读取该block,并加载 ̄lJblockcache中。 其中,blockindex只要读取一次就长驻内存不淘 汰,因此大多数情况下I/O次数是2n+m次,r 为 storefile的数量,m为所请求的数据在几个storeffle 中(由于有版本的概念,通常所请求的数据很 有可能同时在多个storefile中)。SATA盘的隧机 I/O时间大约为8ms,因此完全不命中时读响应 时间大约在20ms左右。新版本的HBase在提高 读性能方面做了很多优化,比如提高对元数据 (bloomfilter)的Cache ̄ff力,把checksum这一次 I/O想办法省去(读本地文件时不读checksum, 或者 ̄Echecksum信息写 ̄1]hfile中)。此外,还有 lazyseek(非常重要的一项优化,0.94以上版本) 让读的storefile尽量少、compact优化算法等一系 列优化都是为了减少n和m的值。 101 

oud Computing云计算 为了在实际应用中满足响应延时的问题,还需要 index ̄读data,而index长驻内存因此命中率接近 对慢连接进行监控,也就是把每次响应的时间都 100%。命中率可以通过regionserver的log文件来 ia来获得。 统计下来,定期发给监控系统。这一点在0 92以 获取,或者通过gangl上的版本中己得到支持。但为了取得更详细的数 我们需要想办法尽可能多地提高内存命中率, 据,恐怕还需要根据自己的需求去修改代码。 比如减/j ̄rowkey大小,将版本数设置为1,设置 至于吞吐量的性能分析,主要取决于排队等候的 合理的TTL。及时清理掉不必要的Cache,比如 时间和锁粒度等。“hbase.regionserve血andler “hbase.IS.evictblocksonclose”参数(O 92以上版 count”是一个重要的参数,它决定服务器端最 本)等。 多启动多少个线程来同时处理RPC请求。一般设 ・负载均衡。分布式环境中需要充分利用各台主 置100-200个线程可以极大提高吞吐量。排队的 机的性能,因此负载均衡是很重要的。当rowkey RPC长度限度为handler数量XlO0,可以通过系统 完全散开后,理论上每台服务器的TPS应该是平 监控来看实时的排队长度。如果排队长度始终为 均的。HBase[ ̄带的balancer线程默认每5分钟工 0,则说明服务器端还有能力并发处理更多的请 作一次,将region数平均分配到所有服务器上。但 求。很多时候吞吐量的瓶颈其实是客户端无法提 这并不是一个很好的选择,比如集群中有一大一 供更多的并发请求了,此时可以尝试让客户端以 小两张表,很有可能小表的region全部集中在一 多连接(注意区别于多线程)的方式请求服务器 台机器上,但总的来说region是均衡的。这种情况 端(HBASE一2939)。 下对小表的请求很有可能全部集中在一台机器上 小结:在性能测试中要注意吞吐量和响应时间。 一了。因此我们需要做表级别的balance。O.94 0版本 HBASEHBase一3373),我 般情况下,我们应该先保证响应时间在一定范 己经有这样的功能了(们也可以很轻松地在之前的版本上实现。 实时监控请求分布是很重要的运维手段。如果 围内,然后再尽可能多地提高吞吐量。 热点数据、负载均衡及store ̄l:]storefile的数量是影Pl ̄HBase 性能的几个关键因素。 几个关键因素 以下是影响HBase性能的几个关键因素。 _热点数据。热点数据即经常需要读取的数据。从 上面的分析可以看出有没有命中内存,读性能的 差距是两个以上的数量级,因此内存命中率对性 能非常重要。 HBase ̄带blockcache,大小由“hfile.block cache size”参数决定。它能将每次读取到的数据以 负载不均衡,那么系统的性能测试是极为不准确 的。因此需要把请求的分布实时统计下来,并定 期发到监控系统展示。 _store和storefi1e的数量。store是HBase的CF (ColumnFamily),每一个列簇是一个store。一 般在设计的时候尽量不要使用过多的CF,因为当 前版本的HBase在支持过多的CF时会有一些使用 上的问题。比如,文件数会过多,多个CF在flush 的一瞬间会有短暂的不一致(近期有些Patch在改 进);memstore过多等。一般尽量将列簇限制在3 个以内,而尽量多地利用列。而且对同一行不同 列簇的操作是串行的,因此性能上会有一定的影 响。表2是我们针对多列簇的测试结果。 可以看出,列簇增加1倍,随机读的响应时间增加 1倍,而列增加则对洼能影响不大。 storefile是同一个列簇下的文件数目。文件数过 64KB为单位缓存起来,即一次随机读的最小单 位是64KB,因此在设计上尽量将需要批量读取的 数据前缀设置为相同或相近,这样可以极大减少 随机I/O次数。 get命中blockcache时,会直接返 回。假设每台服务器有10GB可用于blockcache,  那么2O台机器就能缓存200GB的数据。假设总数 多,会导致读响应变慢,这个前面己经分析过了,据为1TB,那么命中率为70%(50%+0 2/1)。这 但好处是写会变快,原因是写入不受历史数据的 或放 里的50%是blockindex,由于每次读取需要先读 影响。为了追求写入性能,可以关闭compact102 

Cloud Computing云计算 [ ̄compact的速度,但为了追求读的性能,需要适 表2礁机读性能溅试 当加快compact的速度,比如使用多线程compact (O 92以上版本)。这个需要根据应用的读写情况 进行适当的取舍。 另外,对于读取类应用来说,BloomFilter是必须 设置的属性。如果列多的话,那么要尽量设置为 k/v=5Ob/lOOb随机 线程数 lcflq 20 lcf2q 20 2cf2q 20 2cf2q 20 Qps(草 ̄server) Response time(ms) CPU1oad 9476 2.36 6.96 9514 2.1 6.86 4250 4_7 12.14 4702 4-25 15.57 datablockcache命中率 60-29% 60.39% 60.9% 58.87% egion.max.iflesize”,比如可以设成64GB。这样 “ROW”属性。如果是宽表(一行中有成百上千 hrit发生,从而提高系统的写入稳 列),则可以考虑设置为“ROWCOL”属性。通常 可以基本避免spl系统IOWait飙升都是由于BloomFilter没有设置造 成的。 小结:我们需要尽可能多地提高数据的命中率, 并根据命中率来推算需要的服务器数量。我们 需要尽量保持服务器的负载均衡,并调整适当的 balance策略。对读应用来说,要让storefile文件数 尽量少,尽量使用列而不是列簇。 compact和split的影响 如前面所说,compact可以影响读写性能。split也 一样,影响会更加严重。 ・compact的影响:compact期间会将原有的 storefile合并成一个新的storefile,这期间会增加 网络和磁盘的I/O,因此会对系统整体性能造成一 定的影响。如果 ̄HDFS层加大是一个缓解的办 法,比如一个HDFS集群上搭建多个HBase集群, 那么compact的I/O冲击就平摊到了一个大的 HDFS集群上,问题会相对较小。但如果compact 采用默认的串行执行方法,则会在某些写压力很 大的应用上堆积较长的compact队列。这会影响  ̄hlog的滚动和回收,并且对读性能也有不利影 响。所以建议对compact队列做监控,如果真的会 有很长的队列,那么采用多线程compact会有很 大帮助。 -split是在单个region过大时可以自动切分成两个 region,这期间所有该region的请求会失败,所以 我们尽量缩短split的时间或者减sj ̄split的次数。 一个有效的办法是增大region的上限,让split次数 减少,另一个有效的办法是建表时通过对应用数 据的分析做出合适的pre—sharding(预分区)。 我们这里只分析第一种办法,因为这是系统层 面的办法。增) ̄Nregion大小的参数是“hbase 定性。但增加这个值会带来以下几个问题。 _首先是compact的压力会加大,因为要合并的文 件更大了; -其次是由于compact变得更慢,导致要读的:之件 更多了,读响应下降; ・最要命的是大文件使index变大,甚至到达几百 MB或几GB,占用大量内存而且使加载速度变慢。 HBase O.92以上的版本部分解决了这些问题 比 如优化了compact逻辑,让compact去优先选择小 文件合并,尽量减少大文件的重复合并,又比如 使用HFileV2让index由平面结构变成树状结构, 大大减小了index的大小。所以建议对split比较敏 感的用户尽量使用0 92以上的版本。 小结:使用大HDFS集群可以有效降 ̄compact的 影响,但需要注意compact队列的堆积。split对系 统稳定性的影响更大,建议通过pre—sharding以 及增大region的方式来解决这个问题。采用增大 region的方法尽量要采用0 92以上的版本,并注意 读性能是否有下降。 datanode的选择 HBase底层的文件存储采用了HDFS,因此HDFS 本身的性能也可以影[ ̄JHBase。 2011年的Hadoop World大会上toddTodd Lip—son 有一场经典的topic精彩的演讲,讲他们如何优 化HDFS。另外,Facebook也提到过他们如何优 化HDFS让它更适合做实时应用。总结起来看, HDFS在1 0以及Cloudera 3u3以上的版本中性能有 明显的突破,主要体现在以下几点上。 -checksum大小可配置。可将原先的512字节做一 次checksum ̄[[置 ̄64KB做一次,并且采用_= 优 化的CRC32算法,让CPU的消耗大大降低。 103 

loud Computing云计算 _用Socket缓存。通过Keepalive机制来复用连接, 内存方式,可以通过配置项来打开。但要记住在 减少大量重复新建连接的开销,并且重写了 region数过多的场景下不可以使用mslab,它有可 BlockReader,消除了不少数据拷贝。这一项我们 能引起OOM。 测试随机读有13%、随机写有3%的性能提高。 对于大内存的管理,Java的GC会有~定影响,将 ・增加了本地读模式。如果判断到数据在本机,则 来的G1有可能从根本上改善这一状况,但目前G1 直接跳过与datanode的通信,用直接调用文件系 还不太稳定,如果面对32GB、48GB或更大的内 统接口来访问数据,并且由于数据在本机,可以 存,除了调整JVM参数外,使用nat ̄e来管理内存 忽略checksum这一步。这样~来随机读的I/O次 也是一条路径。 104 数直接减少一半,实际测试结果也证明了这一 点:仅这一项优化我们测试随机读性能可以增加 100%以上。 另外,例如出错时重试机制的调整、Lease的及时 释放等改进,都是针对实时应用所做的调整。自 201 1年以来,HDFS层面的优化大大提高了HBase 的性能。由于Hadoop的版本分支非常多,目前性 能有大的优化并且稳定的版本还是Cloudera 3u3 以上,以及社区的1 0(O 20 205)以上版本,可以 参考选择。 小结:不同的HDFS版本对HBase的性能影响也是 不同的,需要多关注。 GC的影响 之前Hypertable的作者曾经认为,在HBase与 Hypertable的性能对比中,让HBase落败的主要 原因是GC。这其实是一个比较片面的观点。读完 前面的内容,你应该比较清楚在实际应用中很多 细节的影响其实要远远超过语言层面那一点点优 化。当然,在理想状况下,GC的作用就会略为明 显,但最多只有1%左右的影响。 在系统压力~般的情况下,比如8核CPU的load在 3-4左右时,我们观察到的GC时间大约占0 5%左 右,也就是说每1s会有5ms左右的Young GC暂停 时间(2GB Young区),而CMS GC的频率并不频 繁,影响也bhYoung GC更小。但在系统上线前最 好多关注一下JVM参数,尽量避免Young区频繁 GC,以及避免发生Full GC。在多列簇的情况下, tL ̄H2-3个列簇,由于碎片的增加,在很高的压力 下发生CMS GC失败并引发Full GC是一件危险的 事,有可能引发长时间的GC,这一点需要多关注 GC日志。这个问题的解决方案可以是mslab分配 小结:GC对性能的影响只是理论上的,并不足以 改变HBase的整体性能。但对于稳定的线上应用 来说,需要密切关注和监控GC的情况,避免出现 长时I ̄]GC的事故。 总结 HBase的性能分析应该结合具体的场景,并对测 试结果进行仔细分析,以便为线上应用提供尽可 能合适的参数。目前hbHBase版本变化非常快,有 很多性能优化点正在进行中,总体来说0 92版本己 经比较稳定,可以尝试在生产环境中使用。@ ■ 责阿改规丰邓任里进划富明编集淘及的鉴线辑宝运团 上:核版维应杨本支心用爽H持系B经统a,(s熟验ye部a,悉。n技 g负各s术h责版u专aH本家Bng,s@ea现的cs主线d源n导上码 维部e,t护署并) 和有、 

结合场景的HBase性能分析

本文发布于:2024-02-08 10:53:43,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170736082367306.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:性能   数据   需要   响应   时间   应用   影响
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23