原文作者Lars Francke,德国汉堡的以为自由软件开发者,关注H系列(Hadoop,HBase,Hive,…)分布式系统。这里是对原文的一个不完全的大致的翻译。
————————————– 毫无理由的分割线 ———————————
ycsb是一个非常方便的针对分布式文件系统的测试工具:https://github.com/brianfrankcooper/YCSB
特点:
1 可以任意设置读写比例、线程数量,打印结果比较详细
2 它是hbase等nosql官方jira上面的测试标准,与人交流时ycsb的测试数据最能说明问题
缺点:
1 每次测试时数据需要重新写入,否则读取时选取不了正确的key值,导致内存命中率低
2 key值分布不均匀,节点多数据少时,会导致倾斜
3 线程多时有bug
本文假设大家已经对HBase有基本的了解,Wikipedia上对HBase的定义:
HBase is an open source, non-relational, distributed database modeled after Google’s BigTable and is written in Java.
雅虎发布了一篇论文,并且实现了一个叫YCSB(Benchmarking Cloud Serving Systems)的性能测试工具。YCSB是一个通用的云测试工具,可以测试包括Cassandra,MongoDB,Voldemort,HBase等各种NoSQL产品,这里我不打算比较不同系统之间的差异,这篇文章主要关注HBase测试。对于不同的参数配置,或者一些patch,上线之前进行测试是非常必要的。
但是要注意,不管你用什么样的压力进行测试,YCSB都只是模拟测试。真实的数据和业务压力场景的测试也是不可少的,YCSB并不能替代此类测试。
在这篇简短的Blog中,我会演示如何在当前版本的HBase上用YCSB执行测试,演示中HBase和YCSB都在同一台机器上,实际测试中,YCSB最好运行在单独的机器,甚至可以使用多台机器并行加压力测试。YCSB测试包括两个阶段:装载数据阶段和执行事务阶段。装载数据阶段会生成测试数据并装载到HBase,记录一些统计信息。而事务阶段则在装载的数据上执行事务。YCSB预先定义了不同压力的测试方案,当然你也可以自定义。
安装配置YCSB
我使用的演示环境是Ubuntu10.04,但应该在其他的Linux发行版上也是适用的。HBase我使用的是0.89开发版,并且设置为standalone模式。
YCSB可以通过github获取最新版本
$ sudo apt-get -y install ant openjdk-6-jdk git-core
$ export JAVA_HOME= /usr/lib/jvm/java-6-openjdk/
$ wget http: //apache .easy-webs.de /hbase/hbase-0 .89.20100726 /hbase-0 .89.20100726-bin. tar .gz
$ tar xvzf hbase-0.89.20100726-bin. tar .gz
$ hbase-0.89.20100726 /bin/start-hbase .sh
$ hbase-0.89.20100726 /bin/hbase shell
create 'usertable' , 'family'
exit
$ git clone http: //github .com /brianfrankcooper/YCSB .git
$ cp hbase-0.89.20100726 /lib/ * YCSB /db/hbase/lib
$ cd YCSB
$ ant
$ ant dbcompile-hbase
如上所示,YCSB需要在HBase中创建一张叫usertable的表,表中包含一个Column Family,CF的名字可自定义。YCSB还需要HBase Client所需要的jar包,简单点可以将HBase/lib目录复制到YVSB下合适的目录中。
运行YCSB
装载数据:
java -cp build/ycsb.jar:db/hbase/lib/* com.yahoo.ycsb.Client -load -db com.yahoo.ycsb.db.HBaseClient -P workloads/workloada -p columnfamily=family -p recordcount=1000 -s
1. 这里是演示,只装载了1000行记录。如果是实际测试,你可能需要1亿条记录或者更多。
2. 如果执行过程中碰到错误,请查阅文档。
3. 官方文档建立使用参数文件代替命令行参数。
4. -s 参数表示每秒将状态信息打印到System.err,如不需要可以关闭。
5. 数据装载完成后,可以察看日志文件load.dat确认。
好,现在进入到执行事务阶段:
java -
cp
build
/ycsb
.jar:db
/hbase/lib/
* com.yahoo.ycsb.Client -t
-db com.yahoo.ycsb.db.HBaseClient -P workloads
/workloada
-p columnfamily=family -p operationcount=1000000 -s
-threads 10 -target 100 > transactions.dat
或者
java -
cp
build
/ycsb
.jar:db
/hbase/lib/
* com.yahoo.ycsb.Client -t
-db com.yahoo.ycsb.db.HBaseClient -P workloads
/workloada
-p columnfamily=family -p operationcount=1000000 -s
-threads 10 -target 100 -p measurementtype=timeseries
-p timeseries.granularity=2000 > transactions.dat
每次执行完毕后检查transactions.dat文件获得测试结果。这里我要再次提到官方文档,对于测试结果有详细的解释。在这个例子中,我们使用了预定义的workloada,其他还有更多预定义的不同压力的测试方案,详细请查阅
文档。
可以看到,YCSB的使用是非常简单的。希望这篇文章可以帮助大家了解这个工具,如果有任何问题,请留下你的评论。
以下是我在使用YCSB过程中碰到的问题:
1. zookeeper client连接问题?
在实际测试过程中,我使用了hbase-0.90.3这个版本,但是zookeeper client一直尝试连接127.0.0.0:2181,而配置好的hbase-site.xml(db/hbase/conf目)看似没有生效。google了一把也没有明确的解决方案,于是在db/hbase/src/com/yahoo/ycsb/db/HBaseClient.java的init()函数中加了一行:config.set("hbase.zookeeper.quorum", "192.168.100.201,192.168.100.200");,问题解决;
另外还顺手将 private static final HBaseConfiguration config = new HBaseConfiguration(); 改成了
private static final Configuration config = HBaseConfiguration.create();