您的位置:首页 > 其它

YCSB基础知识及HBase性能测试

2016-11-11 10:58 459 查看
YCSB是雅虎开源的NoSQL测试工具,本篇以对HBase的调优测试为例介绍其运行流程。

一、准备工作

下载安装: YCSB提供编译后的安装文件,只要下载安装包解压就好。

踩过的坑:

(1) 目前最新的版本为0.11.0。但是我在使用的过程中使用官网推荐的两种方法均不能正常使用:

直接下载安装包,解压过程中有文件损坏,文件不完整

下载源码包用mvn clean package自编译时,进行到83%之后便不再变化

解决办法:转而使用上一个稳定版本0.10.0。这里给出YCSB各个历史版本的下载索引[u][/u]

(2) 网上很多给出的ycsb的用例都是较早版本的,新版本的命令行参数中数据库对应的参数不再是hbase而是hbase094或者hbase098或者hbase10。分别对应测试数据库版本为0.98.x, 0.98.x, 1.0.x。我的hbase版本是1.2.2,显然不符合以上版本要求

解决办法:命令行使用hbase10,同时将$HBASE_HOME/lib目录下的所有文件拷贝到$YCSB_HOME/hbase10-binding/lib中

二、初探

2.1. 安装后的YCSB目录结构如下:



所有文件可以分为以下几种类型:

bin,logs,lib,LICENSENSE.txt

是一般软件安装后都有的,作用不赘述

红框中的目录:

命名规则均为NOSQL数据库名+’-binding’后缀。这些目录也即表示了YCSB支持的所有的NOSQL数据库类型(当然你也可以按照规范加入新的数据库类型)。每个bindings目录内部都有lib子目录,用于存放YCSB对访问这些数据库所需要的一些jar包依赖。这也是之前提到的我的hbase版本是1.2.2时的,将$HBASE_HOME/lib目录下的所有jar包拷贝到$YCSB_HOME/hbase10-binding/lib中原因。这其实是一种偷懒的做法。另一种做法可以是为hbase1.2.2定制自己的访问接口(有时间再写这部分)。

workloads目录:

里面包含一些压力测试的场景文件。YCSB自带了6中压力测试场景,文件和相应场景的对应关系如下:

workloada: 读写均衡型,50%/50% Reads/Writes

workloadb: 读多写少型,95%/5% Reads / Writes

workloadc:只读型,100% Reads

workloadd:读最近写入记录型

workloade:扫描小区间型

2.1. workload文件说明:

这里给出文件workloada的内容,看下其内容如下:



recordcound 是YCSB load(加载元数据)命令的参数,默认值1000表示默认加载的记录条数,可以在命令行显示修改该值(后面介绍)。

Operationcount 是YCSB run(运行压力测试)命令的参数,默认值1000表示默认选取数据库中的1000条数据进行压力测试。对于workloada这种测试场景,就意味着读数据在500左右,写数据也在500左右

workload 指定了workload的实现类为 com.yahoo.ycsb.workloads.CoreWorkload

readallfields表示查询时是否读取记录的所有字段

readproportion表示读操作的比例,该场景为0.5

updateproportion表示更新操作的比例,该场景为0.5

scanproportion表示扫描操作的比例

Insertproportion表示插入操作的比例

Requestdistribution表示请求的分布模式,YCSB提供uniform, zipfian, latest三种分布模式

更多的参数含义可参考:https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads。据此可以定制自己的压力测试场景。例如默认场景中并没有读少写多的场景,本人自定义的workloadg,实现了5%/95% Reads / Writes的读少写多的场景。后面使用。

三、压力测试流程

官方给出的测试步骤包含六步,这里简化为四步,其中一些参数配置和选择的步骤会融合在执行步骤中介绍:

环境初始化:

(1) 创建测试数据表

使用hbase shell命令创建测试数据表usertable,列簇family

$ create 't1',{NAME => 'f1', VERSIONS => 2}




(2) 将hbase依赖的lib的文件拷贝到相应的-bing文件中(我这里是hbase10-binding/lib)【原因在前面已经介绍过】

(3) 将hbase配置文件拷贝到ycsb中

在$YCSB_HOME/hbase10-binding中新建conf目录,并将$HBASE_HOME/conf/hbase-site.xml 拷贝到$YCSB_HOME/hbase10-binding/conf/中

加载数据:

切换到$ YCSB_HOME目录,执行以下命令,加载1,000,000条记录:

bin/ycsb load hbase10 -P workloads/workloada -p threads=10 -p table=usertable -p columnfamily=family -p recordcount=1000000 -s > logs/ load.log


参数解释如下:

load 表示这是一次加载数据操作;

hbase10指明了所用的数据库类型;

-P指明了所用的配置文件的路径;

-p 可以显示修改YCSB内置的默认配置,例如这里配置recordcount=1000000来覆盖之前说过的workloada中默认的recordcount=1000;

-s一次加载数据或执行测试的过程实践很长,YCSB客户端需要定时(默认10s)发送状态信息;

> logs/ load.log表示结果日志写入位置;

执行测试:

以workloada测试场景为例,执行以下命令进行压力测试

./bin/ycsb run hbase10 -P workloads/workloada -threads 10  -p operationcount=1000000 -p table=usertable -p columnfamily=family  -p measurementtype=timeseries -p timeseries.granularity=2000 -s > logs/workloadA/transaction-workloadAA.log


参数解释如下:

-threads 10配置了并发线程个数

-p operationcount=1000000 覆盖了workloada中operationcount=1000表示本次测试操作记录数为1000000

-p measurementtype=timeseries -p timeseries.granularity=2000指明了YCSB客户端多长时间汇总一次延时,timeseries.granularity属性值的单位为1000milliseconds。所以这里的配置就表示2000s记录一次本2000s的平均延时

结果查看:



结果中有吞吐量Thoughout信息,平均延时AverageLatency信息,READ和UPDATE操作的记录数比例也近似50%/50%,延时符合workloada测试场景的,蓝色框中表示每2000s汇报一次当前时间间隔的平均延时,也符合之前timeseries.granularity的配置。

四、HBASE调优及压力测试结果对比

之前看了HBase调优的系列博客:有态度的HBase,因为我是在自己虚拟机上安装的HBase集群,内存6G和磁盘容量32G都很小,其实调优的效果不是很明显,这里只是给出调优的一些参数设置方法,以及测试的方法和维度。

4.1 内存优化

在整体内存为6G的情况下,为保证其他业务正常,总体课规划的内存为2/3 *6G=4G

序号步骤原理计算公式计算值修正值
1规划RegionServer总内存在系统内存允许且不影响其他服务的情况下,越多越好。HBase集群的三台服务器同时安装了Hadoop集群和Spark集群,所以设置为系统总内存的1/41/4 * 4G1G1G
2规划读缓存LRUBlockCache部分BucketCache部分主要缓存用户数据块,默认为25%*JVM_HEAP.此处根据业务负载配置为30%*JVM_HEAP30% * 4G1.2G
3规划写缓存MemStore整个RS内存分为三部分:读缓存、写缓存、其他。在写多读少的业务场景下,写缓存显然应该分配更多内存,而HBase在此处有硬性规定LRUBlockCache + MemStore < 80% * JVM_HEAP,否则RS无法启动。此处设置写缓存为整个RS内存的45%45% * 4G1.8G
按照如上规划的HBase配置如下:

(1) 在hbase-env.sh中配置JVM参数(也即规划的RegionServer的总内存配置)

-XX:SurvivorRatio=2  -XX:+PrintGCDateStamps  -Xloggc:$HBASE_LOG_DIR/gc-regionserver.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -server -Xmx1g -Xms1g -Xmn2g -Xss256k -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:-DisableExplicitGC


各个JVM参数含义如下:



(2) 在hbase-site.xml中配置LRUBlockCache相关参数:

<property>
<name>hfile.block.cache.size</name>
<value>0.3</value>
</property>


hfile.block.cache.size表示LRUBlockCache占用内存在JVM内存中的比例,按照表格2中的规划设置为0.3

(3) 在hbase-site.xml中配置MemStore的相关参数:

<property>
<name>hbase.regionserver.global.memstore.size</name>
<value>0.45</value>
</property>
<property>
<name>hbase.regionserver.global.memstore.size.lower.limit</name>
<value>0.40</value>
</property>


hbase.regionserver.global.memstore.upperLimit表示RegionServer中所有MemStore占有内存在JVM内存中的比例上限。如果所占比例超过这个值,RS会首先将所有Region按照MemStore大小排序,并按照由大到小的顺序依次执行flush,直至所有MemStore内存总大小小于hbase.regionserver.global.memstore.lowerLimit,一般lowerLimit比upperLimit小5%。

4.2 集群初始化配置优化

(1) 增加处理线程的数量:当HBase集群请求数量增多时,应增加RegionServer处理线程/监听线程的数量实现为调整hbase-site.xml中hbase.regionserver.handler.count参数值(默认为30)

(2) 配置WAL Files的数量和大小。

WAL Files的数量为: (regionserver_heap_size * memstore fraction) / (default_WAL_size)

(3) 配置HLog

默认情况下每个小时会滚动,这是通过参数hbase.regionserver.logroll.period控制的,这个参数的默认值是1小时。此外,hbase.regionserver.hlog.blocksize和fs_local.block.size控制当HLog的大小超过32M的时候,会滚动。Hbase.regionserver.logroll.multiplier,默认值是95%,表示日志达到95%的时候,也会进行滚动。

4.3 部分测试结果展示

测试的次数可能不是很充分,测试环境的整体配置较低,结果虽然不是很有参考价值,还是记录在这里

(1) 读写均衡型

横坐标的5,10,20,100,150,200表示并发线程的个数,即-p threads配置的参数值

Before-/After-分别表示调优前后的曲线或柱状





(2) 读多写少型





(3) 只读型





(4) 读后修改再写回型



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: