共计 2726 个字符,预计需要花费 7 分钟才能阅读完成。
写在前面
本文只讲一个很简单的问题,YCSB 对 HBase 集群的测试。虽然网上有很多介绍 YCSB 测试 HBase 的文章,但都是针对本地 HBase 伪分布式集群的。大家都知道,稍微正式一些的压测都会要求测试客户端与目标集群分离部署,而且伪分布式集群通常不会在生产环境下使用,本身也没有太大的压测意义。本文会着重介绍一下压测远程 HBase 完全分布式集群的不同之处。
正文
YCSB 是 Yahoo 开源的性能测试工具,支持很多种类的 NoSQL 数据库测试,这里既包括了经典的 HBase/Cassandra/MongoDB,也有近两年新推出的 Spanner/Kudu 等。此外,YCSB 最大的特点是其灵活性,对于尚未纳入官方支持的 NoSQL 数据库,可以快速进行二次开发。如果你正在进行 NoSQL 数据库选型或者研发一款定制版 Nosql 数据库,那么 YCSB 一定是你居家旅行必备良药。
二次开发工作主要是 com.yahoo.ycsb.DB 的基础上定义自己的接口实现。DB 是一个抽象类,定义了 NoSQL 数据库的 5 类典型操作,包括 insert/update/delete/read/scan。你需要为自己的 Nosql 实现该上述方法。当然还有一些初始化(init)和收尾工作(cleanup)也要有相应的处理。
HBase 是 YCSB 较早支持的 NoSQL 数据库,目前在主线版本上支持 0.98/1.0/1.2/1.4/2.0 几个版本(后两个版本是在 2018-03-23 增加的)。这些版本的主要差别在于对 DB 类的不同实现,阅读源码可以发现,在 1.0 版本后,DB 的实现类并没有发生变化,1.2/1.4/2.0 三个版本都是直接继承了 1.0 版,没有重载任何方法。从这点上来说,Ivan 认为使用其中哪个版本测试应该都是 OK 的。
使用 YCSB 进行 HBase 完全分布式集群测试,主要是以下几个步骤。
1、搭建 HBase 分布式集群
Ivan 的 HBase 版本为 1.2.6,部署 HBase 集群具体步骤略去。
2、下载 YCSB 版本
Ivan 选择的是 YCSB0.13 版本,如果使用 master 应该也是 OK 的,前文已经说过,这两个版本中 HBase 的访问接口是一样的。
wget https://github.com/brianfrankcooper/YCSB/archive/0.13.0-staging.zip
3、编译 YCSB
执行进行编译。
mvn clean package
由于 YCSB 支持了很多 NoSQL 数据库,所以在编译时依赖的 Jar 包也比较多。Ivan 尝试了几次编译,都由于下载依赖包超时失败,尤其是在 cassandra 部分。看了下 maven 的输出信息,超时的部分都是测试相关的。所以调整命令如下
mvn clean package -Dmaven.test.skip=true
编译顺利完成。
4、添加 HBase 配置
本文的重点来了!!!很多人容易犯晕的地方。
事实上,如果 YCSB 与 HBase 伪分布式集群合并部署时,这部分的配置是可以忽略的。YCSB 通过上下文全局变量可以直接得到 HBase 的信息,实现压测。可能这就是网上很多文章并不去介绍配置的原因。
我们还是从 YCSB 官方文档找答案,在 0.94/0.98/1.0 三个版本中给出的配置方式完全不同,仔细阅读发现 1.0 版本实际上是特别针对 Google BigTable 的配置文件。这由于 BigTable 提供了对 HBase 的兼容 API,YCSB 将其作为一种 NoSQL 云服务也纳入了进来。但是此处的配置没有参考意义。在 1.2 版本中,虽然接口代码继承自 1.0 版本,但 readme 中明确提到配置文件要参考 0.98 版本,后续 1.4/2.0 的 readme 基本是照抄。
阅读 0.98 版本的 readme,发现其实设置非常简单,我们只需要将 HBase 集群 master 节点下的 hbase-site.xml 文件拷贝到 YCSB 节点的某个位置,并在稍后的命令中指定即可。
网上有的文章会提到其他配置甚至脚步文件,这里 Ivan 明确的说,只需要 hbase-site.xml,不需要其他文件!!!
Ivan 的 hbase-site.xml 文件内容如下。
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/bigdata/zookeeper-3.4.11/zkData</value>
</property>
</configuration>
事实上,YCSB 主要是从中读取 zookeeper 的节点信息。
Ivan 将 hbase-site.xml 拷贝到 /home/ycsb-hbase/conf(也可根据你的环境定义其他路径)目录下
所以相应的,请修改 YCSB 本地的 hosts 文件,将机器名与 IP 的对应关系维护进去。
5、创建目标表
创建 usertable 表,这个是 YCSB 测试的前置条件,测试脚本中不会自动创建
create ‘usertable’,’family’
6、执行测试命令
最后一步,只需要在命令行中增加 -cp 参数指定 hbase-site.xml 的路径即可。
例如以下命令。
1) 加载数据
bin/ycsb load hbase10 -P workloads/workloada -cp /home/ycsb-hbase/conf -p table=usertable -p columnfamily=family -threads 100
2) 执行 scan 测试
bin/ycsb run hbase10 -P workloads/workloade -cp /home/ycsb-hbase/conf -p table=usertable -p columnfamily=family -threads 100
打完收工。
最后啰嗦一句,YCSB 测试 HBase 完全分布式集群的主要差异在于配置文件,即 hbase-site.xml 和修改本地 hosts 文件,目的是为了连接 zookeeper 集群。
更多 YCSB 介绍与测试命令可参考前文 NoSQL 性能测试工具 YCSB-Running a Workload