乐趣区

HBase测试使用YCSB工具

YCSB 测试 HBase

测试工具选择

  • YCSB(Yahoo! Cloud Serving Benchmark)

YCSB 是一款开源的分布式性能测试工具,常用于测试 NoSQL 产品的读写性能。
YCSB 支持常见的 NoSQL 数据库和数据网格产品,如 Cassandra、MongoDB、HBase、Redis、Infinispan 等主流产品。YCSB 不仅安装使用简单,还能自由扩展测试数据类型和支持的数据库产品

  • PE(PerformanceEvaluation)

这里我们会使用 YCSB,YCSB 对比 PE 有点明显

  1. 可任意设置压测的读写比例、线程数量,最后的测试报告也比较详细
  2. 通过 YCSB 的测试数据报告比较具有说服力,完整。

YCSB 工具使用

运行一个压力测试需要 6 步:

  1. 配置需要测试的数据库
  2. 选择合适的数据库接口层
  3. 选择合适的 workload
  4. 选择合适的运行时参数
  5. 装载数据(loading phase)
  6. 运行测试(transaction phase)

下载 YCSB 包

登入 YCSB github 网,找到下载地址,这里我们选择最新版 0.15,并往下拉找到 hbase12 的版本。不用下载一整个,太大了。

配置需要测试的数据库

这里建议预分区的个数为 10 * RegionServers

hbase(main):001:0> n_splits = 12 # HBase recommends (10 * number of regionservers)
hbase(main):002:0> create 'usertable', 'cf', {SPLITS => (1..n_splits).map {|i| "user#{1000+i*(9999-1000)/n_splits}"}}

选择合适的数据库接口层

使用 ./bin/ycsb shell hbase12 -cp /etc/hbase/conf/ -p columnfamily=A 测试 HBase 数据库接口层配置是否正确。

有 connected 则认为是正常的。

connected 之后,我们就可以做 insert,delete,update 动作了

试着新增两条数据

insert key name=ljkteset
insert key age=18

对应地去 hbase 表查看

hbase(main):002:0> scan 'usertable'
ROW                               COLUMN+CELL                                                                                    
 key                              column=A:age, timestamp=1555485313733, value=18                                                
 key                              column=A:name, timestamp=1555485171128, value=ljktest                                          
1 row(s) in 0.1190 seconds

选择合适的 workload

Workload 定义了如何向数据库中加载测试数据,包括两个部分:

  • Workload Java 类(com.yahoo.ycsb.Workload 的子类)
  • 配置文件(Java Properties 格式)

YCSB 的 CoreWorkload 预置了一些标准测试数据,可以直接使用,包括 6 个不同的类型:

  1. Workload A:

    重更新,50% 读 50% 写,例如 session sotre

  2. Workload B:

    读多写少,95% 读 5% 写,例如 photo tagging

  3. Workload C:

    只读:100% 读,例如 user profile cache

  4. Workload D:

    读最近更新:这个 workload 会插入新纪录,越新的纪录读取概率越大,例如:user status updates

  5. Workload E:

    小范围查询:这个 workload 会查询小范围的纪录,而不是单个纪录,例如:threaded conversations

  6. Workload F:

    读取 - 修改 - 写入:这个 workload 会读取一个纪录,然后修改这个纪录,最后写回,例如:user database

可以根据测试需求选择合适的 workload,也可以新建一个新的 workload。

选择合适的运行时参数

除了在 workload 中配置参数外,YCSB 还支持这些运行时参数:

  • threads:客户端线程数,默认为 1
  • target:每秒的目标操作数,默认为无限制(尽可能快地完成操作)。例如一个操作需要 100 ms,那么一个线程 1s 内可以完成 10 个操作,通过 -target 参数可以将操作放缓,控制在 10 个以下
  • s:每 10s 打印一次客户端状态,用于调试

装载数据

Workload 包含两个阶段:装载阶段和事务阶段。在装载阶段向数据库中插入测试数据。对于 HBase 测试,可以使用下面的命令装载数据
bin/ycsb load hbase12 -P workloads/workloada -p columnfamily=A -threads 2 -s -cp /etc/hbase/conf/

这里使用了默认的 A 类型方案,默认是 1000 条记录数和 1000 条操作数,你可以使用 -p recordcount=10000 -p operationcount=10000 来覆盖原有属性。

输出结果:

2019-04-17 15:48:16:137 3 sec: 1000 operations; 297.09 current ops/sec; [CLEANUP: Count=4, Max=28223, Min=4, Avg=7103, 90=28223, 99=28223, 99.9=28223, 99.99=28223] [INSERT: Count=1000, Max=174847, Min=1001, Avg=2787.16, 90=4787, 99=13831, 99.9=172031, 99.99=174847] 
[OVERALL], RunTime(ms), 3375
[OVERALL], Throughput(ops/sec), 296.2962962962963
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 43
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 1.274074074074074
[TOTAL_GCS_PS_MarkSweep], Count, 1
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 21
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.6222222222222222
[TOTAL_GCs], Count, 5
[TOTAL_GC_TIME], Time(ms), 64
[TOTAL_GC_TIME_%], Time(%), 1.8962962962962964
[CLEANUP], Operations, 4
[CLEANUP], AverageLatency(us), 7103.0
[CLEANUP], MinLatency(us), 4
[CLEANUP], MaxLatency(us), 28223
[CLEANUP], 95thPercentileLatency(us), 28223
[CLEANUP], 99thPercentileLatency(us), 28223
[INSERT], Operations, 1000
[INSERT], AverageLatency(us), 2787.16
[INSERT], MinLatency(us), 1001
[INSERT], MaxLatency(us), 174847
[INSERT], 95thPercentileLatency(us), 6903
[INSERT], 99thPercentileLatency(us), 13831
[INSERT], Return=OK, 1000

运行测试

当装载完测试数据后,就可以运行 workload 测试了。对于 HBase 测试命令为,这样整个测试过程就结束了。

bin/ycsb run hbase12 -P workloads/workloada -p columnfamily=A -threads 2 -s -cp /etc/hbase/conf/

输出结果:

2019-04-17 15:51:57:708 1 sec: 1000 operations; 630.12 current ops/sec; [READ: Count=521, Max=14135, Min=734, Avg=1153.72, 90=1318, 99=5831, 99.9=10695, 99.99=14135] [CLEANUP: Count=4, Max=22991, Min=4, Avg=5784, 90=22991, 99=22991, 99.9=22991, 99.99=22991] [UPDATE: Count=479, Max=140543, Min=770, Avg=1908.56, 90=1724, 99=6067, 99.9=140543, 99.99=140543] 
[OVERALL], RunTime(ms), 1587
[OVERALL], Throughput(ops/sec), 630.119722747322
[TOTAL_GCS_PS_Scavenge], Count, 4
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 21
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 1.3232514177693762
[TOTAL_GCS_PS_MarkSweep], Count, 1
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 25
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 1.5752993068683048
[TOTAL_GCs], Count, 5
[TOTAL_GC_TIME], Time(ms), 46
[TOTAL_GC_TIME_%], Time(%), 2.898550724637681
[READ], Operations, 521
[READ], AverageLatency(us), 1153.7178502879078
[READ], MinLatency(us), 734
[READ], MaxLatency(us), 14135
[READ], 95thPercentileLatency(us), 1638
[READ], 99thPercentileLatency(us), 5831
[READ], Return=OK, 521
[CLEANUP], Operations, 4
[CLEANUP], AverageLatency(us), 5784.0
[CLEANUP], MinLatency(us), 4
[CLEANUP], MaxLatency(us), 22991
[CLEANUP], 95thPercentileLatency(us), 22991
[CLEANUP], 99thPercentileLatency(us), 22991
[UPDATE], Operations, 479
[UPDATE], AverageLatency(us), 1908.561586638831
[UPDATE], MinLatency(us), 770
[UPDATE], MaxLatency(us), 140543
[UPDATE], 95thPercentileLatency(us), 3023
[UPDATE], 99thPercentileLatency(us), 6067
[UPDATE], Return=OK, 479

附录

  • YCSB github 官网
  • YCSB wiki
  • YCSB 测试 HBase
  • 使用 HrdHistogram plotter 来画图
  • 第 95 个百分位的概念理解
  • ycsb 测试 HBASE 与 MYSQL
退出移动版