HBase2.0中的Benchmark工具 — PerformanceEvaluation

摘要: 在项目开发过程当中,咱们常常须要一些benchmark工具来对系统进行压测,以得到系统的性能参数,极限吞吐等等指标。而在HBase中,就自带了一个benchmark工具—PerformanceEvaluation,能够很是方便地对HBase的Put、Get、Scan等API进行性能测试,并提供了很是丰富的参数来模拟各类场景。java

简介
在项目开发过程当中,咱们常常须要一些benchmark工具来对系统进行压测,以得到系统的性能参数,极限吞吐等等指标。而在HBase中,就自带了一个benchmark工具—PerformanceEvaluation,能够很是方便地对HBase的Put、Get、Scan等API进行性能测试,并提供了很是丰富的参数来模拟各类场景。这篇文章,就以HBbase2.0中的PerformanceEvaluation工具为例,给你们讲解一下这款HBase benchmark工具的使用和注意事项算法

参数介绍
PerformanceEvaluation的全名是org.apache.hadoop.hbase.PerformanceEvaluation. 已经集成在了bin/hbase工具集中。在安装好HBase的机器上,在HBase的安装路径的bin目录下执行hbase pe,加上相应参数,便可运行PE工具(如下简称PerformanceEvaluation为PE)。若是不加任何参数,则会输出PE的帮助信息。apache

[root@xxxxxx ~]# hbase pe
Usage: java org.apache.hadoop.hbase.PerformanceEvaluation \
  <OPTIONS> [-D<property=value>]* <command> <nclients>

General Options:
 nomapred        Run multiple clients using threads (rather than use mapreduce)
 oneCon          all the threads share the same connection. Default: False
 sampleRate      Execute test on a sample of total rows. Only supported by randomRead. Default: 1.0
 period          Report every 'period' rows: Default: opts.perClientRunRows / 10 = 104857
 cycles          How many times to cycle the test. Defaults: 1.
 traceRate       Enable HTrace spans. Initiate tracing every N rows. Default: 0
 latency         Set to report operation latencies. Default: False
 measureAfter    Start to measure the latency once 'measureAfter' rows have been treated. Default: 0
 valueSize       Pass value size to use: Default: 1000
 valueRandom     Set if we should vary value size between 0 and 'valueSize'; set on read for stats on size: Default: Not set.
 blockEncoding   Block encoding to use. Value should be one of [NONE, PREFIX, DIFF, FAST_DIFF, ROW_INDEX_V1]. Default: NONE
...(后面还有很长)

PE工具的参数很是多,不少参数只是用于某项专门的测试。这里我只介绍一下比较重要的几个全局参数。数组

nomapred 采用MapReduce的方式启动多线程测试仍是经过多线程的方式,若是没有安装MapReduce,或者不想用MapReduce,一般咱们采用多线程的方式,所以通常在命令中加上--nomapred来表示不使用MapReduce。
oneCon 多线程运行测试时,底层使用一个仍是多个参数。这个参数默认值为false,每一个thread都会启一个Connection,建议把这个参数设为True,至于缘由,后面的章节会讲。
valueSize 写入HBase的value的size,单位是Byte,你们能够根据本身实际的场景设置这个Value的大小。
blockEncoding PE工具会自动建表,这个参数用来指定表的block encoding。关于encoding后面会有专门的文章介绍,这里再也不讲。
table 测试表的名字,若是不设,默认为TestTable。
rows 总共测试的行数。注意这里的行数是指单线程的行数,若是rows=100, 线程数为10,那么在写测试中,写入HBase的将是 100 x 10 行。
size 总测试的数据大小,单位为GB,这个参数与上面的size是互斥的,不要两个参数一块儿设。在使用randomReads和randomSeekScans测试时,这个size能够用来指定读取的数据范围。这个值在Read时很是重要,若是设的很差,会产生不少返回值为空的读,影响测试结果,下面会详细介绍。
compress 设置表的compress算法,根据本身选择,默认是None,即不作压缩。
presplit 表的预分裂region个数,在作性能测试时必定要设置region个数,否则全部的读写会落在一个region上,严重影响性能
autoFlush 默认为false,即PE默认用的是BufferedMutator,BufferedMutator会把数据攒在内存里,达到必定的大小再向服务器发送,若是想明确测单行Put的写入性能,建议设置为true。我的以为PE中引入autoFlush会影响统计的准确性,由于在没有攒够足够的数据时,put操做会立马返回,根本没产生RPC,可是相应的时间和次数也会被统计在最终结果里。
比较重要的参数就这么多,其余的参数要么使用默认就好,要么就是和具体的测试命令相关,用户能够根据测试的内容具体设置。安全

使用示例
下面我用测试读和写两个示例来说解下PE工具的使用服务器

随机写测试 RandomWriteTest
RandomWriteTest经常使用来评估HBase的写性能。使用的命令以下:多线程

hbase pe --nomapred --oneCon=true --valueSize=100 --compress=SNAPPY --rows=150000 --autoFlush=true --presplit=64 randomWrite 64

在这个测试中,我把PE模式设为了非MapReduuce(--nomapred),即采用起线程的形式。跑的命令是randomWrite,即随机写入、后面跟的64表明起了64个线程来作写入。--rows=150000 表明每一个线程会写入150000行数据。其余的参数含义能够参见以前的章节。PE工具的全部的输出都会直接写到LOG文件,LOG的位置须要参照HBase的设置。运行结束后,PE会分别打出每一个线程的延迟情况。以下面是其中一个线程的结果:运维

2018-05-18 12:07:23,282 INFO  [TestClient-11] hbase.PerformanceEvaluation(475): Latency (us) : mean=2516.36, min=872.00, max=73776.00, stdDev=1978.60, 50th=2304.00, 75th=2605.00, 95th=3418.00, 99th=790
8.00, 99.9th=34241.00, 99.99th=73263.00, 99.999th=73776.00
2018-05-18 12:07:23,282 INFO  [TestClient-11] hbase.PerformanceEvaluation(475): Num measures (latency) : 150000
2018-05-18 12:07:23,283 INFO  [TestClient-11] hbase.PerformanceEvaluation(475): Mean      = 2516.36
Min       = 872.00
Max       = 73776.00
StdDev    = 1978.60
50th      = 2304.00
75th      = 2605.00
95th      = 3418.00
99th      = 7908.00
99.9th    = 34241.00
99.99th   = 73263.00
99.999th  = 73776.00

PE统计了这个线程一共跑了多少行,和相应的延迟统计,包括min,max,999th延迟等等。
并在最后统计了全部线程的最大持续时间,平均持续时间等等。dom

2018-05-18 12:07:25,564 INFO  [main] hbase.PerformanceEvaluation(507): [RandomWriteTest duration ]      Min: 36969ms    Max: 40160ms    Avg: 38203ms

比较坑的是,PE居然不会统计全部线程的平均延迟和总的吞吐。。。工具

随机读测试 RandomReadTest
在进行RandomReadTest以前,须要准备数据。准备数据建议使用SequentialWriteTest。以下面的语句

hbase pe --nomapred --oneCon=true --valueSize=100 --compress=SNAPPY --size=2 --presplit=64 sequentialWrite 64

为啥要用SequentialWriteTest?

这是由于PE写入的行是有规律的。若是传入的是--row=1000,thread数是10,则写入的行总数是1000 x 10 = 10000。在SequentialWrite中,PE会给每一个线程设置偏移量,保证0~9999这10000个行(会把全部数字扩展成26位等长的byte数组)一行不差地写入HBase。若是是RandomWriteTest,在每一个线程中会随机生成一个0~9999以前的数字写入(--row=1000表明每一个线程会写1000次)。因为是随机,会形成中间有些行没有写入,那么在读取测试时,读到的就是空行,影响测试结果。

为啥要用--size而不是--row?

--size=2,表明写入2GB数据,具体是多少行PE内部会本身去算。假设我这里填的是--row=1000,线程数是10,那么写入的数据范围是0~9999。当我在作RandomReadTest时,若是须要修改线程数,好比我想测20个线程并行读,那么数据读取的范围将是0~ (1000 * 20 - 1), 很大一部分读是空读!你固然能够根据线程数来调整读测试时row变量的值,使读的总体范围不超过写入的数据范围,可是row的大小影响了总体测试的时间,而统一用size你就啥都不用管了。

RandomReadTest的命令以下:

hbase pe --nomapred --oneCon=true --valueSize=100 --size=2 randomRead 100
注意在读测试时不要加表的任何参数,如presplit这些,若是加了会使PE从新建表,以前写入的数据就拜拜了。valueSize和size的值要与准备数据命令中保持一致,PE靠这两个值来算数据的范围和行数。Read测试的输出与Write测试的输出相似。

PE工具存在的问题
PE工具虽然功能已经比较完备,可是使用下来发现仍是存在必定的问题的,主要有如下几点:

Connection的数目设置只能由oneCon这个参数指定,要么就是一个connection,要么就是每一个thread一个connection。当测试的线程数比较多时,就比较尴尬了,若是只用一个connection,connection内部的metaCache等实现都是有锁的,在拿metacache时,线程较多会产生争抢,影响对服务器性能的评估。若是每一个thread一个connection更加不可取,每一个connection中都会有一个netty的客户端,若是我没记错的话,每一个客户端中将会有 2*CPU个worker threads。这在PE运行过程当中产生大量的context switch,更加影响性能测试。根据个人测试发现,在开100个thread测试时,若是每一个thread开一个connection,测试结果比只用一个connection的要慢10%。Context switch的频率更是10倍以上。
没有multiPut的支持,PE写时使用的BufferedMutator须要靠调整size来决定buffer多少个put再上发。若是我想明确测试batch 5个put请求,batch10个put请求,都比较难实现。
没有统计整体的RT和TPS/QPS,只有按单个thread统计,若是我用100个thread去压服务器,这要我怎么去评估服务器的吞吐……
针对以上的问题,我对PerformanceEvaluation工具作了一些改进,回馈给了社区,具体你们能够看HBASE-20601这个issue。主要的改进有:

加入multiPut参数,支持设置batch的数量
加入connCount参数,支持设置connection的多少,好比connCount=2,无论多少个thread都会共用这2个connection
支持统计全部线程的平均TPS,平均延迟
一些代码的优化和去重
你们在PE工具的使用过程当中还遇到了什么问题,或者有什么不懂的地方,欢迎与我联系。

云端使用
阿里HBase目前已经在阿里云提供商业化服务,任何有需求的用户均可以在阿里云端使用深刻改进的、一站式的HBase服务。云HBase版本与自建HBase相比在运维、可靠性、性能、稳定性、安全、成本等方面均有不少的改进,
原文连接

相关文章
相关标签/搜索