使用YCSB对HBase进行压测

(一)YCSB介绍:
YCSB,全称为“Yahoo!Cloud Serving Benchmark”。是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等。在运行YCSB的时候,可以配置不同的workload和DB,也可以指定线程数&并发数等其他参数。

(二)使用姿势:
以最常见的HBase的性能测试为例。

1、hbase上建表,先后执行以下两个命令:
hbase> n_splits = 120
hbase> create ‘usertable’,’family’,{SPLITS => (1…n_splits).map{|i| “user#{1000+i*(9999-1000)/n_splits}"}}

命令含义:pre-splitting strategy
                  使用HBase shell建表的同时建立一些预分区,这样可以防止初次插入数据时的热点问题

2、直接在github上下载YCSB-master,修改YSCB-MASTER目录下的pom.xml文件中的hbase.version为集群中的相应版本

     需要注意的是在/hbase/src/main/java/com/yahoo/ycsb/db目录下有两份HBase客户端文件,分别是HBaseClient.java和HBaseClient10.java,其中10对应了1.0.0版本的HBase客户端。如果您的HBase版本不是1.0.0版本的话,删掉该文件.

3、使用maven编译YSCB-master,在YSCB的根目录下执行mvn clean package命令,之后就能在distribution工程的target中看到ycsb-0.1.4.tar.gz,将该包拷贝出来就可以使用。

4、将yscb-0.1.4/hbase-binding/conf目录下的hbase-site.xml替换为测试目标的hbase-site.xml

5、执行以下命令进行测试
           
bin/ycsb load hbase10 -P workloads/workloada -p table=usertable -p columnfamily=family -p recordcount=100

bin/ycsb run hbase10 -P workloads/workloada -p table=usertable -p columnfamily=family

     bin/ycsb [load|run] dbname –P path/to/workloadfile –p key=value

     用户首先需要用load初始化数据库,然后用run运行负载。dbname指定了目标数据库。-P指定负载文件的位置。-p用来设置一些参数,比如数据库的ip和port。当然,在运行YCSB之前,目标数据库必须是开启的。测试完成后,YCSB会打印平均/最小/最大延迟等信息。

     如果你在执行上述命令后出现以下报错:
                    ImportError: No module named argparse
     那是由于缺少argparse这个python模块,可以执行sudo easy_install argparse,安装此模块。

     -cp指定了hbase的配置文件所在的路径;

     如果在运行过程中出现如下的错误,可以忽略:

使用YCSB对HBase进行压测_第1张图片

出现上述错误的原因在于放置于yscb-0.1.4/hbase-binding/conf目录下的hbase-site.xml文件,在该文件中,包含了如下的一条与底层hdfs集群相关的一条配置:


        hbase.rootdir
        hdfs://mgjcluster/hbase2
该配置的含义是指定了hbase在底层hdfs上的数据是在hbase2目录下,底层hdfs集群的名称是mgjcluster。ycsb在读取该配置时,不能识别mgjcluster的名称,所以会出现上述错误。但是ycsb作为客户端读写hbase集群只需要集群的zk地址就好,并不需要底层hdfs上的数据目录,所以上述错误并不影响ycsb的使用。如果想要避免上述错误,只需要把mgjcluster改成hdfs active namenode的ip地址就好,格式active namenode ip:9000。

此外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,读改写,客户端读出一个记录,修改它并将被修改的记录返回

此外,YCSB还提供了一些参数,供用户指定,主要用到的如下参数

-target n 测试的目标吞吐;

-threads n 指定用于测试的客户端线程数;

-s  打印状态信息到终端;

一个完整的ycsb压测hbase的命令实例如下:

bin/ycsb load hbase10 -P workloads/workloadb -threads 30 -p table=usertable -p columnfamily=family -p recordcount=100000

如上压测的hbase表名是usertable,列族名是family,用于压测的客户端线程数是30个,负载类型workloadb,压测数据100000例。压测输出的结果实例如下:

使用YCSB对HBase进行压测_第2张图片

上述的输出结果中主要包括了处理请求的总时间(Runtime),请求的吞吐量(Throughput),表示每秒钟可处理的请求个数,平均延时(AverageLatency),单位是us,95%的操作延时和99%的操作延时,单位都是us。此外还包括了GC相关的一些metrics。

关于前面的CLEANUP和INSERT,这里做个说明,insert代表的是用于压测的客户端发往集群的请求,所以insert标示的metrics代表了对集群性能的真实度量,而cleanup表示的是客户端的一些现场清理工作,比如每个客户端线程在读写完hbase之后,都需要断开到zk的连接等等,所以CLEANUP标示的metrics不需要过多关注。


参考资料:

https://github.com/brianfrankcooper/YCSB/issues/548

https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads


你可能感兴趣的:(hbase)