YCSB压测HBase经验分享

写这篇文章之前首先要感谢我们的群主范欣欣范神,感谢范神在我压测过程中给予的指导,可惜的是由于机器比较紧张的缘故,还没来得及优化,机器就被回收走了,使得最终测出来的集群性能并不是很好,所以最终测试的结果大家只是最低标准的一个参考吧。

1.    YCSB介绍:
YCSB,全称为“Yahoo!Cloud Serving Benchmark”。是雅虎开发的用来对云服务进行基础测试的工具,其内部涵盖了常见的NoSQL数据库产品,如Cassandra、MongoDB、HBase、Redis等等。在运行YCSB的时候,可以配置不同的workload和DB,也可以指定线程数&并发数等其他参数。
2.    YCSB版本选择
当前最新版本0.13.0但是需要自己打包编译,从网上查到的资料说需要修改pom文件中的HBase版本,因为我们的HBase用的是HBase 1.2.0-cdh5.8.3的,由于不清楚HBase所依赖的hadoop的版本没找到需要在哪里修改,担心会对测试有影响,故放弃了0.13.0的版本,最终采用0.12.0,网上有说为了解决版本的问题,需要把$HBASE_HOME/lib目录下的所有文件拷贝到$YCSB_HOME/hbase10-binding/lib中,我不确定这一操作是否是必须的,我没有把$HBASE_HOME/lib目录下的所有文件拷贝到$YCSB_HOME/hbase10-binding/lib中在运行的过程中并没有报错,(所以大家自行选择吧)当然如果有人对此有较好的见解欢迎补充。0.12.0下载地址:https://github.com/brianfrankc ... ar.gz
注:如果有人使用过0.13.0的,希望还可以提供些指导意见
3.    YCSB使用操作
(1)下载YCSB客户端
curl -0 --location https://github.com/brianfrankc ... ar.gz
(2)解压YCSB
tar xfvz ycsb-hbase10-binding-0.12.0.tar.gz
(3)进入YCSB客户端
cd ycsb-hbase10-binding-0.12.0
(4)YCSB文件介绍
YCSB自带有6中workload配置文件,,分别为在workloads目录下的workloada、workloadb、workloadc、workloadd、workloade、workloadf,每个文件对应用于模拟不同的压力场景:
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,读改写,客户端读出一个记录,修改它并将被修改的记录返回
可根据需要自行设置每个文件里的Recordcount以及operationcount:在加载(load)阶段插入表中的记录数或在运行(run)阶段之前已经在表中记录的数目,recordcount=1000;
在运行阶段所进行的操作数,operationcount=1000
注:具体参数的意义大家可以参考workload_template文件里的说明
(5)运行YCSB客户端
YCSB提供了一些参数,供用户指定,主要用到的如下参数:
-threads n 指定用于测试的客户端线程数
-s  打印状态信息到终端
-P指明了所用的配置文件的路径;
-p 可以显示修改YCSB内置的默认配置,例如使用 -p recordcount=1000000来覆盖之前说过的workloada中默认的recordcount=1000
注:在指定线程数时应使用-threads n而不是-p threads=n
1) 创建测试数据表
使用hbase shell命令创建测试数据表usertable,列簇family
n_splits = 200
create 'usertable', 'family', {SPLITS => (1..n_splits).map {|i| "user#{1000+i*(9999-1000)/n_splits}"}}
2) 将hbase配置文件拷贝到ycsb中
在$YCSB_HOME/ ycsb-hbase10-binding-0.12.0中新建conf目录,并将$HBASE_HOME/conf/hbase-site.xml 拷贝到$YCSB_HOME/ ycsb-hbase10-binding-0.12.0 /conf/中或者直接在运行的命令行里指定
3) 加载数据
nohup python bin/ycsb load hbase10 -P workloads/workload_init -cp $HBASE_HOME/conf/ -p table=usertable -p columnfamily=family -p insertstart=0 -threads 500 -s > load_workload_init_500.txt 2>&1  &
注:这里我用了nohup,大家可自行选择是否使用nohup运行,我没有把hbase-site.xml拷贝到ycsb相应的目录下,而是在运行命令是指定的。workload_init是我自行创建的用于数据初始化的文件。大家在加载数据的时候注意表名和列簇名是否与创建的测试数据表一致。
压测输出样例.png

注:上述的输出结果中主要包括了处理请求的总时间(Runtime),请求的吞吐量(Throughput),表示每秒钟可处理的请求个数,平均延时(AverageLatency),单位是us,95%的操作延时和99%的操作延时,单位都是us。此外还包括了GC相关的一些metrics。关于前面的CLEANUP和INSERT,这里做个说明,insert代表的是用于压测的客户端发往集群的请求,所以insert标示的metrics代表了对集群性能的真实度量,而cleanup表示的是客户端的一些现场清理工作,比如每个客户端线程在读写完hbase之后,都需要断开到zk的连接等等,所以CLEANUP标示的metrics不需要过多关注
4) 执行测试
nohup python bin/ycsb run  hbase10 -P workloads/workloada -cp $HBASE_HOME /conf -p table=usertable -p columnfamily=family -threads 10 -s >run_workloada_10.txt  2>&1 &
4.    测试环境
本次测试中,测试环境为2+4(2个master,4个regionserver),生成数据的YCSB程序与HBase集群并不运行在相同的物理集群。
服务器硬件配置
服务器硬件配置.png

软件版本信息
软件版本信息.png

5.    测试结果
(1)单条记录插入
1)测试参数
总记录数为10亿,分为200个region,均匀分布在4台region server上;插入操作执行2千万次;插入请求分布遵从zipfian分布;
2)测试结果
insert.png

(2)单纯查询
1) 测试参数
总记录数为10亿,分为200个region,均匀分布在4台region server上;查询操作执行2千万次;查询请求分布遵从zipfian分布;
2) 测试结果
read.png

(3)查询插入平衡
1) 测试参数
总记录数为10亿,分为200个region,均匀分布在4台region server上;查询插入操作共执行2千万次;查询请求分布遵从zipfian分布;
2) 测试结果
readAndInsert.png

(4) Range扫描查询
1) 测试参数
总记录数为10亿,分为200个region,均匀分布在4台region server上;scan操作执行两百万次,请求分布遵从zipfian分布; scan最大长度为1000条记录, scan长度随机分布且遵从uniform分布;
2) 测试结果
scan.png

 

1 个评论

楼主棒棒哒

要回复文章请先登录注册