ITPub博客

YCSB--HBase性能测试工具的安装和使用

NoSQL 作者:loveheping 时间:2018-08-31 19:57:41 0 删除 编辑

YCSB

一、背景概念

英文全称:Yahoo!CloudServing Benchmark(YCSB)。是Yahoo公司的一个用来对云服务进行基础测试的工具。目标是促进新一代云数据服务系统的性能比较。为四个广泛使用的系统:Cassandra、HBase、PNUTS和一个简单的片式MySQL执行,订了套核心基础测试和结果报告。

 

二、资源获取

首先在官网上下载源码编译或者直接下载软件包

https://github.com/brianfrankcooper/YCSB/releases/tag/0.10.0

编译的话需要maven工程和其他资源包的依赖比较麻烦,建议直接下载软件包。

 

补充一点编译的内容:

下载好最新源码

解压到本地并进入源码根目录YCSB-0.10.0

 

如果想编译出完整版的话直接输入

mvn clean package

编译成功的话,在YCSB-0.10.0/distribution目录下会有对应的ycsb的压缩包,拷贝解压即可使用

这种方法编译出的完整版ycsb适用于多种数据库所以依赖的库太多,目标文件太大,耗费时间太长,不建议用这种方式编译。

 

建议单独编一个只用于测试某个数据库(例如hbase)的ycsb可输入

mvn -pl com.yahoo.ycsb:hbase10-binding -am clean package   #我就是用这种方法编的

编译结果节选:

…..

[INFO] Building tar: /opt/YCSB-0.10.0/hbase10/target/ycsb-hbase10-binding-0.10.0.tar.gz

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Summary:

[INFO]

[INFO] YCSB Root ......................................... SUCCESS [1.903s]

[INFO] Core YCSB ......................................... SUCCESS [8.384s]

[INFO] Per Datastore Binding descriptor .................. SUCCESS [0.497s]

[INFO] YCSB Datastore Binding Parent ..................... SUCCESS [0.582s]

[INFO] HBase 1.0 DB Binding .............................. SUCCESS [51.209s]

[INFO] ------------------------------------------------------------------------

[INFO]  BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 1:03.143s

[INFO] Finished at: Sat Jul 09 11:30:05 PHT 2016

[INFO] Final Memory: 52M/1694M

[INFO] ------------------------------------------------------------------------

 

 

这种方法编译成功的话,在 YCSB-0.10.0/hbase10/target  目录下会有

ycsb-hbase10-binding-0.10.0.tar.gz  压缩包即我们的目标文件,解压之后即可使用

 

环境中的mvn仓库使用的是172.7.1.216上的资源,在实际编译的过程中会遇到依赖包不匹配或者依赖包不存在的问题,可以手动的在 search.maven.org 上去搜索下载相应的资源放在本地的 ~/.m2/repository/  的对应目录下即可

 

我们这里测的是hbase所以就是直接下载了 ycsb-hbase10-binding-0.10.0.tar.gz (注意这个只是对hbase10即hbase1.0的适用,官网上有一个对所有数据库全适用的软件包,300M太大了网络不好没有必要去下)使用。

 

三、配置与使用

这里首先要去检查下 hbase-site.xml 中的配置是否正确,不然在运行ycsb时会报错

 


<property>

  <name>hbase.regionserver.global. memstore .size</name>

  <value> 0.4 </value>

</property>

.

.

.

<property>

      <name> hfile.block.cache.size </name>

      <value> 0.2 </value>

    </property>

 

 

将下载好的ycsb-hbase10-binding-0.10.0.tar.gz解压使用

目录结构:

[ root@node1 ycsb-hbase10-binding-0.10.0 ]# ll

total 24

drwxr-xr-x 2 root root   46 Jul  8 15:12 bin

drwxr-xr-x 2 root root 4096 Jul  8 15:12  lib

-rw-r--r-- 1 root root 8082 Jul  7 20:45 LICENSE.txt

-rw-r--r-- 1 root root  615 Jul  7 20:45 NOTICE.txt

-rw-r--r-- 1 root root 5484 Jul  7 20:45 README.md

drwxrwxr-x 2 root root  126 Jul  7 20:45  workloads

 

 

这里额外介绍一下一个完全版本的ycsb的目录结构

[ root@node1 ycsb-0.1.4 ]# ll

total 20

drwxrwxrwx 2  501 games   31 Feb 24  2012 bin

drwxr-xr-x 3 root root    16 Jul  8 11:49 cassandra-binding

-rw-r--r-- 1  501 games 2291 Feb 24  2012 CHANGELOG

drwxr-xr-x 3 root root    16 Jul  8 11:49 core

drwxr-xr-x 4 root root    27 Jul  8 11:49 gemfire-binding

drwxr-xr-x 4 root root    27 Jul  8 11:49  hbase-binding

drwxr-xr-x 4 root root    27 Jul  8 11:49 infinispan-binding

drwxr-xr-x 4 root root    27 Jul  8 11:49 jdbc-binding

-rw-r--r-- 1  501 games 8082 Feb 19  2012 LICENSE.txt

drwxr-xr-x 3 root root    29 Jul  8 11:49 mapkeeper-binding

drwxr-xr-x 3 root root    16 Jul  8 11:49 mongodb-binding

drwxr-xr-x 4 root root    40 Jul  8 11:49 nosqldb-binding

-rw-r--r-- 1  501 games  479 Feb 19  2012 NOTICE.txt

-rw-r--r-- 1  501 games  952 Feb 24  2012 README

drwxr-xr-x 3 root root    16 Jul  8 11:49 redis-binding

drwxr-xr-x 2 root root    27 Jul  8 14:38 results

drwxr-xr-x 4 root root    27 Jul  8 11:49 voldemort-binding

drwxrwxrwx 2  501 games  102 Feb 22  2012 workloads

 

 

完整版需要手动去拷贝相关hbase库到 hbase-binding 的lib目录下,并将 hbase-site.xml 拷贝至 hbase-binding 的conf目录下。

 

而我们 ycsb-hbase10-binding-0.10.0 针对性更强更加精简,在lib目录下面有所需的各种库文件,无需手动从hbase的lib目录下去cp过来了,也没有conf目录,我们只需直接使用bin下面的ycsb即可。

 

下面介绍下具体的使用方法:

1、  hbase上建表,YCSB需要在HBase中创建一张叫usertable的表,表中包含一个Cloumn Family,CF的名称可以自定义。先后执行以下两个命令:

hbase(main):011:0*  n_splits=120

=> 120

 

hbase(main):015:0>  create 'usertable','family',{SPLITS => (1...n_splits).map{|i| "user#{1000+i*(9999-1000)/n_splits}"}}

0 row(s) in 18.3610 seconds

 

=> Hbase::Table - usertable

 

 

命令含义:pre-splittingstrategy预分区和建表

  使用HBase shell建表的同时建立一些预分区,这样可以防止初次插入数据时的热点问题

 

2、使用以下命令进行测试

首先初始化数据

-cp指定了hbase的配置文件所在的路径 /usr/hdp/2.4.2.0-258/hbase/conf/ (前面提到过精简版的ycsb没有conf目录)

用户首先需要用load初始化数据库,然后用run运行负载。dbname指定了目标数据库。

目前YCSB自带了6种负载(workloads/目录下),其中五种如下表。用户可以自定义操作(read、update、insert和scan)的比例,以及选择操作目标记录的分布:Uniform(等概率随机选择记录)、Zipfian(随机选择记录,存在热纪录)和Latest(近期写入的记录是热记录)。

-P指定负载文件的位置。

-p用来设置一些参数,比如数据库的 ip和port。当然,在运行YCSB之前,目标数据库必须是开启的。测试完成后,YCSB会打印平均/最小/最大延迟等信息。后面可以带参数threads recordcount 等等

-s 输出运行状态,在运行时间较长时比较有用

 

[root@node1  ycsb-hbase10-binding-0.10.0 ]# bin/ycsb load hbase10 -P workloads/workloada -cp/usr/hdp/2.4.2.0-258/hbase/conf/ -p table=usertable -p columnfamily=family -s -threads10 -p recordcount=100

#这里加载的是workloada负载,read和update操作各占一半

 

2016-07-08 16:19:37,129 WARN  [Thread-2] util.DynamicClassLoader: Failed to identify the fs of dir hdfs://node1.dcom:8020/apps/hbase/data/lib, ignored

java.io.IOException: No FileSystem for scheme: hdfs    该错误可以忽略!!!

         at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2579)

         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2586)

         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89)

         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2625)

         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2607)

         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368)

         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)

         at org.apache.hadoop.hbase.util.DynamicClassLoader.<init>(DynamicClassLoader.java:104)

         at org.apache.hadoop.hbase.protobuf.ProtobufUtil.<clinit>(ProtobufUtil.java:232)

         at org.apache.hadoop.hbase.ClusterId.parseFrom(ClusterId.java:64)

         at org.apache.hadoop.hbase.zookeeper.ZKClusterId.readClusterIdZNode(ZKClusterId.java:75)

         at org.apache.hadoop.hbase.client.ZooKeeperRegistry.getClusterId(ZooKeeperRegistry.java:86)

         at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.retrieveClusterId(ConnectionManager.java:833)

         at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.<init>(ConnectionManager.java:623)

         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

         at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

         at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:238)

         at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:218)

         at org.apache.hadoop.hbase.client.ConnectionFactory.createConnection(ConnectionFactory.java:119)

         at com.yahoo.ycsb.db.HBaseClient10.init(HBaseClient10.java:149)

         at com.yahoo.ycsb.DBWrapper.init(DBWrapper.java:99)

         at com.yahoo.ycsb.ClientThread.run(Client.java:418)

         at java.lang.Thread.run(Thread.java:745)

 

 

Ycsb运行完之后的结果打印和分析:

[OVERALL], RunTime(ms), 2787.0          数据加载所用时间: 2.787

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

[TOTAL_GCS_PS_Scavenge], Count, 1.0

[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 20.0

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

[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.7176175098672408

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

[CLEANUP], AverageLatency(us), 63575.0              平均响应时间 63.575ms

[CLEANUP], MinLatency(us), 14.0                                      最小响应时间 0.014ms

[CLEANUP], MaxLatency(us), 127167.0                   最大响应时间 127.167ms

[CLEANUP], 95thPercentileLatency(us), 127167.0        95% cleanup 操作延时在 127.167ms 以内

[CLEANUP], 99thPercentileLatency(us), 127167.0        99% cleanup 操作延时在 127.167ms 以内

[INSERT], Operations, 100.0           执行 insert 操作的总数, 100

[INSERT], AverageLatency(us), 13681.54      每次 insert 操作的平均时延, 13.68154ms

[INSERT], MinLatency(us), 5556.0          所有 insert 操作最小延时, 5.556ms

[INSERT], MaxLatency(us), 201343.0    所有 insert 操作最大延时, 201.343ms

[INSERT], 95thPercentileLatency(us), 30063.0     95% insert 操作延时在 30.063ms 以内

[INSERT], 99thPercentileLatency(us), 53183.0     99% insert 操作延时在 53.183ms 以内

[INSERT], Return=OK, 1000   成功返回数, 1000

 

                                                                                         

然后执行run程序

[root@node1ycsb-hbase10-binding-0.10.0]#  bin/ycsb run hbase10 -Pworkloads/workloada -cp /usr/hdp/2.4.2.0-258/hbase/conf/ -p table=usertable -pcolumnfamily=family -s –threads 10 -p recordcount=100

 

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

[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

 

 

四、用例介绍

这里介绍下,我们在用ycsb进行hbase性能测试时的用例方法。

首先,测试使用了ycsb_load.sh和ycsb_run.sh这两个脚本来直接进行,用户只需自定义一个类似于workload类型的配置文件即可。

 

对应目录结构:

[root@node5 test]# pwd

/root/ycsb-hbase10-binding-0.10.0/workloads/test

 

[root@node5 test]# ll

total 4338592

-rw-r--r-- 1 root hadoop       1189 Aug 27 22:35 TR1003

-rw-r--r-- 1 root hadoop 4080039015 Aug 29 03:12 TR1003.report

-rw-r--r-- 1 root hadoop        800 Aug 30 16:20 TR1004

-rw-r--r-- 1 root hadoop  306542869 Aug 30 16:31 TR1004.report

-rw-r--r-- 1 root hadoop        751 Aug 30 10:06 TR1005

-rw-r--r-- 1 root hadoop   56106292 Aug 30 10:20 TR1005.report

-rw-r--r-- 1 root hadoop        631 Aug 23 19:07 workload_test_template

-rwxr-xr-x 1 root hadoop        590 Aug 23 17:52 ycsb_load.sh

-rwxr-xr-x 1 root hadoop        609 Aug 30 16:35 ycsb_run.sh

 

其中后缀名为report的文件是脚本运行和ycsb运行时的所有终端打印记录(文件较大,测完之后取得关键数值后可以删除)。

 

Ycsb_load.sh脚本内容:

echo "******Loading test begin******"

 

# define the path of ycsb

YCSB="/root/ycsb-hbase10-binding-0.10.0"

 

# define the path of  hbase_site.xml

hbase=$YCSB"/bin"

 

# define test path

test=$YCSB"/workloads/test/"

 

# define the file path of workload

workload=$test$1

 

# define the log file name

report=$test$1".report"

 

# define ycbs runner

runner=$YCSB"/bin/ycsb"

 

# define measurement param

raw_file=$test$1".raw"

measurement_param="measurement.raw.output_file="$raw_file

 

# run test

$runner load hbase10 -cp $hbase -P $workload -s -jvm-args='-Xmx32g' 1>>$report 2>>$report

 

echo "******Loading test end******"

 

 

脚本内容较为简单,ycsb_run.sh脚本的内容与上述内容几乎一样(最后一句的ycsb运行命令中的load改为run),其中$1变量时用户在运行时所指定的配置文件(workload、TR1003等)。

-jvm-args='-Xmx32g'  这个是用来配置ycsb运行时jvm虚拟机的内存大小的,这里的意思是最多给ycsb clinet进程分配32G的内存

具体用法: sh ycsb_load.sh TR1003

 

ycsb配置文件TR1003(作用跟workload文件相同)

# The thread count

threadcount=20

 

# The number of fields in a record

fieldcount=1

 

# The size of each field (in bytes)

fieldlength=9216

 

# Number of Records will be loaded

recordcount=1500000000

 

# Number of Operations will be handle in run parsh

operationcount=1500000000

readallfields=true

insertorder=hashed

insertstart=0

insertcount=500000000

 

# Control Porption of hbase operation type

readproportion=0

updateproportion=0

scanproportion=1

insertproportion=0

 

# The following param always be fixed

# The table name

table=usertable

 

# The colume family

columnfamily=cf

 

# The workload class

workload=com.yahoo.ycsb.workloads.CoreWorkload

 

# The measurement type

measurementtype=raw

 

clientbuffering=true

 

writebuffersize=25165824

 

#requestdistribution=zipfian

 

这个配置文件是单独用来load阶段加载数据库时候用的,其中 clientbuffer 配置项是配置hbase client端的写缓存,配置写缓存有利用减少写hbase操作时的rpc开销,具体作用可以查看hbase测试调优文档,默认是不配的,该配置项默认的值是配置项 writebuffersize =1024*1024*12(12M),requestdistribution是指操作需求分布采用的方式,。

 

Run阶段配置文件TR1003:

# The thread count

threadcount=100

 

# The number of fields in a record

fieldcount=1

 

# The size of each field (in bytes)

fieldlength=9216

 

# Number of Records will be loaded

recordcount=1500000000

 

# Number of Operations will be handle in run parsh

operationcount=2000000

readallfields=true

#insertorder=hashed

#insertstart=0

#insertcount=500000000

 

# Control Porption of hbase operation type

readproportion=0

updateproportion=0

scanproportion =1

insertproportion=0

 

# The following param always be fixed

# The table name

table=usertable

 

# The colume family

columnfamily=cf

 

# The workload class

workload=com.yahoo.ycsb.workloads.CoreWorkload

 

# The measurement type

measurementtype=raw

 

maxscanlength =1000000

 

#hbase.usepagefilter=false

 

# scanlengthdistribution =zipfian

 

#requestdistribution=latest

 

 

这个配置文件用在run阶段,与ycsb_run.sh配合使用,这里run阶段主要就是读hbase数据库的数据。

scan:

Maxscanlength 配置项用来指定scan的条数(在ycsb代码中的实现方式是取1~Maxscanlength中的随机值作为一次scan的条数)

hbase.usepagefilter配置项是scan一次的结果是否采取分页显示,默认是开启的

scanlengthdistribution 配置项决定了以何种方式从1~Maxscanlength区间中取值,还是默认的uniform(等概率随机分布)。

另外值得注意的是在执行scan操作中,ycsb每秒操作数currentops/sec可能会很小:

2016-08-30 04:21:40:791 60 sec: 1 operations;  0.1  current ops/sec; est completion in 1388 days 21hours SCAN count: 1, average latency(us): 49083737.00

这个是由于ycsb计算方式的原因,它只计算每次具体的操作数,而不是scan总数,所以0.1可以理解为在10秒钟的时间内执行了1次scan操作,所以这10秒的平均操作数是0.1 current ops/sec。

对于scan操作我们可以通过带宽来计算一次操作到底扫描了多少条数据。

 

Read:

Read的话跟load阶段输出类似,每次查找一条读取。

 

注意!!!:

     Load阶段其实就是装载数据即往hbase中插入数据,workload文件中的recordcount就是将要插入的条数,run阶段就是对hbase进行各种操作,operationcount就是操作数,因此load阶段必须要正确执行完成,否则在run阶段会有类似于[READ-FAILED]之类的错误。

五、参考资料

具体详细信息可参考网络资料和官网 https://github.com/brianfrankcooper/YCSB

六、修订说明

日期

版本

修订

审批

修订说明

2016.9.29

1.0

章鑫8








 转自:https://blog.csdn.net/zx8167107/article/details/78753283


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31511218/viewspace-2213357/,如需转载,请注明出处,否则将追究法律责任。

上一篇: HBase优化实战
请登录后发表评论 登录
全部评论

注册时间:2017-12-13

  • 博文量
    41
  • 访问量
    10964