hbase自带的压力测试使用

个人推荐使用:https://github.com/brianfrankcooper/YCSB/


示例: 顺序写命令:

hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=10000 --valueSize=8000 randomWrite 5
hbase pe --nomapred --oneCon=true --valueSize=1000 --compress=GZ --rows=150000 --autoFlush=true --presplit=64 --families=4 --columns=6 --table=zyc_pe_test --caching=1000 randomWrite 100

–nomapred表示不使用MAPREDUCE框架
–oneCon=true 所有线程是否共享连接
–valueSize=100 一次写入所写入value的大小
–compress 压缩方式
–presplit=64 创建预分表(初始情况下将table分为多少个分区)
–autoFlush=true client在收到put请求时是否每次都发送到region server
–rows=150000 每个线程需要发送的数据量
每次测试都会删除之前测试创建的测试表。删除表的时间不计入结果

说明: 命令行创建5个客户端,并且执行持续的写入测试。每个客户端每次写入8000字节, 每个客户端共写入10000行. 命令行将一直显示完成的进度直到打印最后的结果,当用户确定客户端服务器负载并不大时,可增加一定数量的客户端(也就是说线程或者MapReduce任务)

顺序读:
hbase org.apache.hadoop.hbase.PerformanceEvaluation sequentialRead 1
随机写:
hbase org.apache.hadoop.hbase.PerformanceEvaluation randomWrite 1
随机读:
hbase org.apache.hadoop.hbase.PerformanceEvaluation randomRead 1

参数说明:

hbase pe org.apache.hadoop.hbase.PerformanceEvaluation <OPTIONS> [-D<property=value>]* <command> <nclients>

其中
Options:

 nomapred        采用MapReduce的方式启动多线程测试还是通过多线程的方式,如果没有安装MapReduce,或者不想用MapReduce,通常我们采用多线程的方式,因此一般在命令中加上--nomapred来表示不使用MapReduce。
 rows            每个客户端(线程)运行的行。默认值:一百万。注意这里的行数是指单线程的行数,如果rows=100, 线程数为10,那么在写测试中,写入HBase的将是 100 x 10 行
 size            总大小,单位GiB。与--rows互斥。默认值:1.0。
 sampleRate      样本比例:对总行数的一部分样本执行测试。只有randomRead支持。默认值:1.0
 traceRate      启用HTrace跨度。每N行启动一次跟踪。默认值:0
 table           测试表的名字,如果不设,默认为TestTable。
 multiGet        如果> 0,则在执行RandomRead时,执行多次获取而不是单次获取。默认值:0
 compress        要使用的压缩类型(GZ,LZO,...)。默认值:'无'
 flushCommits    该参数用于确定测试是否应该刷新表。默认值:false
 writeToWAL      在puts上设置writeToWAL。默认值:True
 autoFlush       默认为false,即PE默认用的是BufferedMutator,BufferedMutator会把数据攒在内存里,达到一定的大小再向服务器发送,如果想明确测单行Put的写入性能,建议设置为true。个人觉得PE中引入autoFlush会影响统计的准确性,因为在没有攒够足够的数据时,put操作会立马返回,根本没产生RPC,但是相应的时间和次数也会被统计在最终结果里。
 oneCon          多线程运行测试时,底层使用一个还是多个链接。这个参数默认值为false,每个thread都会启一个Connection,建议把这个参数设为True
 presplit        表的预分裂region个数,在做性能测试时一定要设置region个数,不然所有的读写会落在一个region上,严重影响性能
 inmemory        试图尽可能保持CF内存的HFile。不保证始终从内存中提供读取。默认值:false
 usetags         与KV一起写标签。与HFile V3配合使用。默认值:false
 numoftags       指定所需的标签号。仅当usetags为true时才有效。
 filterAll       通过不将任何内容返回给客户端,帮助过滤掉服务器端的所有行。通过在内部使用FilterAllFilter,帮助检查服务器端性能。
 latency         设置为报告操作延迟。默认值:False
 bloomFilter      Bloom 过滤器类型,[NONE,ROW,ROWCOL]之一
 valueSize       写入HBase的value的size,单位是Byte,大家可以根据自己实际的场景设置这个Value的大小。默认值:1024
 valueRandom     设置是否应该在0和'valueSize'之间改变值大小;设置读取大小的统计信息:默认值: Not set.
 valueZipf       设置是否应该以zipf格式改变0和'valueSize'之间的值大小, 默认值: Not set.
 period          报告每个'period'行:默认值:opts.perClientRunRows / 10
 multiGet        批处理组合成N组。只有randomRead支持。默认值: disabled
 replicas        启用区域副本测试。默认值:1。
 splitPolicy     为表指定自定义RegionSplitPolicy。
 randomSleep     在每次获得0和输入值之前进行随机睡眠。默认值:0

 Note: -D properties will be applied to the conf used. 
  For example: 
   -Dmapreduce.output.fileoutputformat.compress=true
   -Dmapreduce.task.timeout=60000

Command:
 filterScan      使用过滤器运行扫描测试,根据它的值查找特定行(确保使用--rows = 20) 
 randomRead      运行随机读取测试
 randomSeekScan  运行随机搜索和扫描100测试
 randomWrite     运行随机写测试
 scan            运行扫描测试(每行读取)
 scanRange10     使用开始和停止行(最多10行)运行随机搜索扫描
 scanRange100    使用开始和停止行运行随机搜索扫描(最多100行)
 scanRange1000   使用开始和停止行(最多1000行)运行随机搜索扫描
 scanRange10000  使用开始和停止行运行随机搜索扫描(最多10000行)
 sequentialRead  运行顺序读取测试
 sequentialWrite  运行顺序写入测试

Args:
 nclients        整数。必须要有该参数。客户端总数(和HRegionServers)
running: 1 <= value <= 500


Examples:
 运行一个单独的客户端:
 

hbase org.apache.hadoop.hbase.PerformanceEvaluation sequentialWrite 1

 

1 顺序写测试

测试基准:10个并发客户端,写入200万行数据

1.1 无压缩顺序写 

hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=2000000 --nomapred --table=none_test randomRead 10

1.2 LZO顺序写

hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=2000000 --nomapred --compress=LZO --table=none_test randomRead 10

1.3 有无压缩对比

对比指标 不压缩 LZO压缩
插入100万行数据平均时间    
文件大小(1000万行数据)  19.2G  4.7G

 

 

 

 

参考:

https://yq.aliyun.com/articles/594384
https://help.aliyun.com/document_detail/68370.html 

==================

YCSB: https://github.com/brianfrankcooper/YCSB/blob/master/README.md

打开workloada查看信息

以下是workloada、workloadb、workloadc、workloadd、workloade、workloadf的相关文件信息

workloada 读写均衡型,50%读,50%写
workloadb 读多写少型,95%读,5%更新。
workloadc 只读,100%读。
workloadd 读最近写入记录型,95%读,5%插入。
workloade 扫描小区间型,95%扫描,5%插入。
workloadf 读写入记录均衡型,50%读,50%读、修改、写。
./bin/ycsb.sh load basic -P workloads/workloada
./bin/ycsb.sh run basic -P workloads/workloada

 

bin/ycsb load hbase20 -P workloads/workloada -cp /etc/hbase/conf/ -p table=usertable -p columnfamily=family -s -threads 50 -p recordcount=100000

 

上面参数含义:

  • hbase-10 说明测试的是针对hbase1.x版本
  • -p columnfamily=cf 插入hbase的列簇cf
  • -p recordcount=100000000 总计插入1亿条数据 【可选】
  • -jvm-args '-Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256m' 设置JVM参数【可选】
  • -p threadcount=100 客户端线程数为100,并发100【可选】
  • -s load.dat 记录测试结果到 load.dat
  • -P workloads/workloada 采用默认配置workloads/workloada,里面设置了插入占比50%,更新占比50%,默认往cf列簇插入10个列的数据,每个列的数据大小为100bytes,10个列的话总计大约1K大小数据

Ycsb运行完成结果打印与分析:

[OVERALL], RunTime(ms), 6921.0                                              数据加载所用时间:6.921秒

[OVERALL], Throughput(ops/sec), 144.48779078167894    加载操作的吞吐量,平均并发量每秒144.48条

[TOTAL_GCS_PS_Scavenge], Count, 1.0

[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 20.0

[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.2889755815633579

[TOTAL_GCS_PS_MarkSweep], Count, 0.0

[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0.0

[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0

[TOTAL_GCs], Count, 1.0

[TOTAL_GC_TIME], Time(ms), 20.0

[TOTAL_GC_TIME_%], Time(%), 0.2889755815633579

[CLEANUP], Operations, 2.0                                                         执行cleanup的操作总数,2

[CLEANUP], AverageLatency(us), 71591.5                               平均响应时间71.5915ms

[CLEANUP], MinLatency(us), 15.0                                              最小响应时间0.015ms

[CLEANUP], MaxLatency(us), 143231.0                                    最大响应时间143.231ms

[CLEANUP], 95thPercentileLatency(us), 143231.0                 95%的insert操作延时在143.231ms以内

[CLEANUP], 99thPercentileLatency(us), 143231.0                 99%的insert操作延时在143.231ms以内

[READ], Operations, 480.0                                                执行read的操作总数,480

[READ], AverageLatency(us), 5027.9625                               平均响应时间5.027ms

[READ], MinLatency(us), 2254.0                                               最小响应时间2.254ms

[READ], MaxLatency(us), 158847.0                                              最大响应时间158.847ms

[READ], 95thPercentileLatency(us), 10767.0                          95%的read操作延时在10.767ms以内

[READ], 99thPercentileLatency(us), 14599.0                          99%的read操作延时在14.599ms以内

[READ], Return=OK, 480                                                               成功返回数,480

 关注几个信息:

RunTime(ms):    数据加载所用时间,单位毫秒(ms)

Throughput(ops/sec):    吞吐量,即ops(每秒操作次数)

Operations:    操作的总次数

AverageLatency(us):    平均响应延时,单位是微秒(us)

MinLatency(us):    最小响应时间,单位是微秒(us)

MaxLatency(us):    最大响应时间,单位是微秒(us)

95thPercentileLatency(us):    95%的操作延时,单位是微秒(us)

99thPercentileLatency(us):    99%的操作延时,单位是微秒(us)

Return=OK:    成功返回数,这个值不符合测试要求,则证明测试失败.

[READ]开头的代表只读的操作记录,其他还有例如上面的[insert],[UPDATE]等,

 

[UPDATE], Operations, 520.0                                                       执行read的操作总数,520

[UPDATE], AverageLatency(us), 5812.123076923077          平均响应时间5.812ms

[UPDATE], MinLatency(us), 3302.0                                            最小响应时间3.302ms

[UPDATE], MaxLatency(us), 86207.0                                         最大响应时间86.207ms

[UPDATE], 95thPercentileLatency(us), 9991.0                        95%的read操作延时在9.991ms以内

[UPDATE], 99thPercentileLatency(us), 11839.0                      99%的insert操作延时在11.839ms以内

[UPDATE], Return=OK, 520                                                           成功返回数,520

posted @ 2019-05-30 19:15  柚子=_=  阅读(1622)  评论(0编辑  收藏  举报