使用YCSB执行HBase性能测试

时间:2020-12-28 04:49:29

原文链接:http://blog.lars-francke.de/2010/08/16/performance-testing-hbase-using-ycsb/

原文作者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获取最新版本

?
12345678910111213 $ 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();