1、YCSB背景
YCSB,全称为“Yahoo!Cloud Serving Benchmark”,是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等。在运行YCSB的时候,可以配置不同的workload和DB,也可以指定线程数&并发数等其他参数。
2、初探
首先在官网上下载源码编译或者直接下载软件包:https://github.com/brianfrankcooper/YCSB/releases/tag/0.10.0
(编译的话需要maven工程和其他资源包的依赖比较麻烦,建议直接下载软件包,解压后进行简单的操作(下文介绍)后就能直接用。)
下载压缩包后上传到对应的主机,解压tar –xvf ycsb-0.12.0.tar.gz后的文件夹内目录结构如下:
所有文件可以分为以下几种类型:
- bin,logs,lib,LICENSENSE.txt
是一般软件安装后都有的,作用不赘述
- 红框中的目录:
命名规则均为NOSQL数据库名+’-binding’后缀。这些目录也即表示了YCSB支持的所有的NOSQL数据库类型,同时你也可以按照规范加入新的数据库类型。每个bindings目录内部都有lib子目录,用于存放YCSB对访问这些数据库所需要的一些jar包依赖。将$HBASE_HOME/lib目录下的所有jar包拷贝到$YCSB_HOME/hbase10-binding/lib中(lib文件夹本身存在,直接进行复制拷贝即可),同时将$HBASE_HOME/conf/hbase-site.xml拷贝到$YCSB_HOME/hbase10-binding/conf中(conf文件夹自己创建),这样就算安装成功了。
- workloads目录
里面包含一些压力测试的场景文件。YCSB自带了6中压力测试场景,文件和相应场景的对应关系如下:
workloada:混合了50%的读和50%的写;
workloadb:Read mostly workload,混合了95%的读和5%的写,该workload侧重于测试集群的读能力;
workloadc:Read only,100%只读;
workloadd:Read latest workload,插入数据,接着就读取这些新插入的数据;
workloade:Short ranges,短范围scan,不同于随机读,每个测试线程都会去scan一段数据;
workloadf:Read-modiy-wirte,读改写,客户端读出一个记录,修改它并将被修改的记录返回;
【workload文件说明】
这里给出文件workloada的内容,看下其内容如下:
- recordcound 是YCSB load(加载元数据)命令的参数,默认值1000表示默认加载的记录条数,可以在命令行显示修改该值(后面介绍)。
- Operationcount 是YCSB run(运行压力测试)命令的参数,默认值1000表示默认选取数据库中的1000条数据进行压力测试。对于workloada这种测试场景,就意味着读数据在500左右,写数据也在500左右
- workload 指定了workload的实现类为 com.yahoo.ycsb.workloads.CoreWorkload
- readallfields表示查询时是否读取记录的所有字段
- readproportion表示读操作的比例,该场景为0.5
- updateproportion表示更新操作的比例,该场景为0.5
- scanproportion表示扫描操作的比例
- Insertproportion表示插入操作的比例
- Requestdistribution表示请求的分布模式,YCSB提供uniform, zipfian, latest三种分布模式
更多的参数含义可参考:https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads。据此可以定制自己的压力测试场景。
3、压力测试流程
3.1环境初始化:
(1) 创建测试数据表
使用hbase shell命令创建测试数据表usertable,列簇family
create 'usertable', 'family'
(2) 将hbase依赖的lib的文件拷贝到相应的-bing文件中(我这里是hbase10-binding/lib)【前面也已介绍】
(3) 将hbase配置文件拷贝到ycsb中。在$YCSB_HOME/hbase10-binding中新建conf目录,并将$HBASE_HOME/conf/hbase-site.xml 拷贝到$YCSB_HOME/hbase10-binding/conf/中【前面也已介绍】
3.2加载数据:
切换到$ YCSB_HOME目录,执行以下命令,加载1,000,000条记录:
bin/ycsb load hbase10 -P workloads/workloada -p threads=10 -p table=usertable -p columnfamily=family -p recordcount=10000 -s > logs/load.log (或 bin/ycsb load hbase10 -P workloads/workloada -p threads=10 -p table=usertable -p columnfamily=family -p recordcount=10000 )
参数解释如下:
load 表示这是一次加载数据操作;
hbase10指明了所用的数据库类型;
-P指明了所用的配置文件的路径;
-p 可以显示修改YCSB内置的默认配置,例如这里配置recordcount=10000来覆盖之前说过的workloada中默认的recordcount=1000;
-s一次加载数据或执行测试的过程实践很长,YCSB客户端需要定时(默认10s)发送状态信息;> logs/load.log表示结果日志写入位置(若没有logs文件夹就自己新建一个,也可以不加此参数,则运行结果直接打印到屏幕上);
或
3.3执行测试
以workloada测试场景为例,切换到$ YCSB_HOME目录,执行以下命令进行压力测试
bin/ycsb run hbase10 -P workloads/workloada -threads 10 -p operationcount=1000000 -p table=usertable -p columnfamily=family -p measurementtype=timeseries -p timeseries.granularity=2000 -s > logs/transaction-workloadAA.log
参数解释如下:
-threads 10配置了并发线程个数
-p operationcount=1000000 覆盖了workloada中operationcount=1000表示本次测试操作记录数为1000000
-p measurementtype=timeseries -p timeseries.granularity=2000指明了YCSB客户端多长时间汇总一次延时,timeseries.granularity属性值的单位为1000milliseconds。所以这里的配置就表示2000s记录一次本2000s的平均延时。
测试运行结果的各属性含义相关说明如下:
参考资料(依次递减):
https://blog.csdn.net/zhangchen2449/article/details/53126884
https://blog.csdn.net/zx8167107/article/details/78753283
https://blog.csdn.net/Fighingbigdata/article/details/79495251
https://wenku.baidu.com/view/65a07ac5a0c7aa00b52acfc789eb172ded6399b8.html
https://blog.csdn.net/hustsselbj/article/details/46540377