YCSB基础知识及HBase性能测试

YCSB是雅虎开源的NoSQL测试工具,本篇以对HBase的调优测试为例介绍其运行流程。

一、准备工作

下载安装: YCSB提供编译后的安装文件,只要下载安装包解压就好。
踩过的坑:
(1) 目前最新的版本为0.11.0。但是我在使用的过程中使用官网推荐的两种方法均不能正常使用:

  • 直接下载安装包,解压过程中有文件损坏,文件不完整
  • 下载源码包用mvn clean package自编译时,进行到83%之后便不再变化

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

(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的内容,看下其内容如下:
YCSB基础知识及HBase性能测试_第1张图片

  • 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. 环境初始化:
    (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/中

  2. 加载数据:
    切换到$ 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表示结果日志写入位置;

  3. 执行测试:
    以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的平均延时

  4. 结果查看:
    YCSB基础知识及HBase性能测试_第2张图片
    结果中有吞吐量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/4 1/4 * 4G 1G 1G
2 规划读缓存LRUBlockCache部分 BucketCache部分主要缓存用户数据块,默认为25%*JVM_HEAP.此处根据业务负载配置为30%*JVM_HEAP 30% * 4G 1.2G
3 规划写缓存MemStore 整个RS内存分为三部分:读缓存、写缓存、其他。在写多读少的业务场景下,写缓存显然应该分配更多内存,而HBase在此处有硬性规定LRUBlockCache + MemStore < 80% * JVM_HEAP,否则RS无法启动。此处设置写缓存为整个RS内存的45% 45% * 4G 1.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参数含义如下:
YCSB基础知识及HBase性能测试_第3张图片
(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-分别表示调优前后的曲线或柱状
YCSB基础知识及HBase性能测试_第4张图片
YCSB基础知识及HBase性能测试_第5张图片

(2) 读多写少型


YCSB基础知识及HBase性能测试_第6张图片

(3) 只读型
YCSB基础知识及HBase性能测试_第7张图片
YCSB基础知识及HBase性能测试_第8张图片

(4) 读后修改再写回型
YCSB基础知识及HBase性能测试_第9张图片
YCSB基础知识及HBase性能测试_第10张图片

你可能感兴趣的:(hbase,ycsb)