参考博客:http://blog.csdn.net/bryce123phy/article/details/51254235
https://zhuanlan.zhihu.com/p/29370650
上一篇对大数据平台基准测试结合其他博客作了一个总结,这两天需要对hbase进行性能测试,这里也对雅虎的YCSB作一下自己的总结。
1、YCSB介绍
YCSB,全称为“Yahoo!Cloud Serving Benchmark”。是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等。在运行YCSB的时候,可以配置不同的workload和DB,也可以指定线程数&并发数等其他参数。
此外ycsb的workloads/目录下保存了6种不同的workload类型,代表了不同的压测负载类型,详细的介绍列在下面:
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,读改写,客户端读出一个记录,修改它并将被修改的记录返回;
2、YCSB工具的下载,安装
下载链接:https://github.com/brianfrankcooper/YCSB/releases/download/0.12.0/ycsb-0.12.0.tar.gz
相关wiki文档:https://github.com/brianfrankcooper/YCSB/wiki
这个下载下来的直接解压就可以使用,应该是编译好的。
3、使用前的一些错误排查
运行ycsb命令,出现如下报错:
[ERROR] argparse not found. Try installing it via "pip".
说明:报错缺少argparse包,建议通过pip方式安装。
argparse是Python用于解析命令行参数和选型的标准模块,用于替代已过时的optparse模块。
由于这里我机器没有安装pip,所以需要先安装pip:
wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate
python get-pip.py
pip install argparse
4、执行ycsb命令测试hbase性能
①在hbase shell中创建表:
②进行YCSB安装目录的bin目录;
使用load初始化Hbase表数据(20万条)
./ycsb load hbase10 -P../workloads/workloada -p threads=10 -cp /etc/hbase/conf -p table=usertable -p columnfamily=f1 -p recordcount=200000 -s > ./load.report
解释:db 这里ycsb里支持的hbase数据库为hbase10;
-p:是传入的参数;
-cp 参数为hbase的一些配置文件路径,也可以拷贝到ycsb安装目录的对应位置;
threads:YCSB客户端的线程数。可选地,这可以在命令行指定(默认:1);
table:是hbase表的名称;
columnfamily:是hbase表的列族;
recordcount:装载进数据库的初始记录数;
fieldcount:一条记录中的字段数(默认:10);
fieldlength:每个字段的大小(默认:100);
-s 打印测试报告信息到终端或存储到某个目录;
运行过程中会有一个WARN,可以忽略,如想解决,可以看文章开头参考的博客。
18/03/09 10:46:39 INFO zookeeper.ZooKeeper: Client environment:user.name=root
18/03/09 10:46:39 INFO zookeeper.ZooKeeper: Client environment:user.home=/root
18/03/09 10:46:39 INFO zookeeper.ZooKeeper: Client environment:user.dir=/opt/software/ycsb-0.12.0/bin
18/03/09 10:46:39 INFO zookeeper.ZooKeeper: Initiating client connection, connectString=cdh-agent2:2181,cdh-agent4:2181,cdh-agent3:2181 sessionTimeout=60000 watcher=hconnection-0x668863810x0, quorum=cdh-agent2:2181,cdh-agent4:2181,cdh-agent3:2181, baseZNode=/hbase
18/03/09 10:46:39 INFO zookeeper.ClientCnxn: Opening socket connection to server cdh-agent2/10.0.2.163:2181. Will not attempt to authenticate using SASL (unknown error)
18/03/09 10:46:39 INFO zookeeper.ClientCnxn: Socket connection established to cdh-agent2/10.0.2.163:2181, initiating session
18/03/09 10:46:39 INFO zookeeper.ClientCnxn: Session establishment complete on server cdh-agent2/10.0.2.163:2181, sessionid = 0x2620888dc5f004a, negotiated timeout = 60000
18/03/09 10:46:39 WARN util.DynamicClassLoader: Failed to identify the fs of dir hdfs://cdh-agent1:8020/hbase/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)
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []
2018-03-09 10:46:49:272 10 sec: 4601 operations; 460.1 current ops/sec; est completion in 12 seconds [INSERT: Count=4602, Max=141183, Min=1240, Avg=1941.06, 90=2747, 99=4231, 99.9=7039, 99.99=141183]
18/03/09 10:46:55 INFO client.ConnectionManager$HConnectionImplementation: Closing master protocol: MasterService
18/03/09 10:46:55 INFO client.ConnectionManager$HConnectionImplementation: Closing zookeeper sessionid=0x2620888dc5f004a
18/03/09 10:46:55 INFO zookeeper.ZooKeeper: Session: 0x2620888dc5f004a closed
18/03/09 10:46:55 INFO zookeeper.ClientCnxn: EventThread shut down
2018-03-09 10:46:55:495 16 sec: 10000 operations; 867.59 current ops/sec; [CLEANUP: Count=2, Max=113151, Min=7, Avg=56563.5, 90=113151, 99=113151, 99.9=113151, 99.99=113151] [INSERT: Count=5398, Max=11591, Min=763, Avg=1113.9, 90=1286, 99=1680, 99.9=4871, 99.99=8103]
③运行run进行负载测试
./ycsb run hbase10 -P ../workloads/workloada-p threads=10 -cp /etc/hbase/conf -p table=usertable -p columnfamily=f1 -s >./run.report
④查看测试结果报告,验证hbase性能;
⑤报告含义
1.测试报告内容包括处理请求的总时间(Runtime),请求的吞吐量(Throughput),表示每秒钟可处理的请求个数,平均延时(AverageLatency),单位是us,95%的操作延时和99%的操作延时,单位都是us。此外还包括了GC相关的一些metrics。
2.关于前面的CLEANUP和INSERT,这里做个说明,insert代表的是用于压测的客户端发往集群的请求,所以insert标示的metrics代表了对集群性能的真实度量,而cleanup表示的是客户端的一些现场清理工作,比如每个客户端线程在读写完hbase之后,都需要断开到zk的连接等等,所以CLEANUP标示的metrics不需要过多关注。