ApsaraDB for HBase性能/延时全面领先社区版本

HBase测试报告

本文将介绍我们对阿里云HBase以及HBase1.1.12进行的测试的细节,大概会介绍测试的环境,测试工具分析以及我们对工具的选择,测试的case,以及测试的结果分析。

1.测试环境

​ 1.1.物理环境:

​ 服务端:单台regionserver:8core,32G,4X250G ssd

​ Client:16core 64G,双client压;

​ 1.2.软件环境:

​ client:hbase-1.1.2

​ server:ApsaraDB for HBase, HBase1.1.12

​ JDK: Ali-JDK-1.8

​ 1.3.测试条件:

​ 2个client压server端,打满server的性能,server端是单Regionserver。写操作500w数据,共1000万数据,scan,读分别单线程操作5k,5w数据。操作的单条value大小1000B(1KB)

2.测试步骤

2.1.测试工具分析:

​ 测试工具之前一直在YCSB和HBase 自带工具PerformanceEvaluation二者之间进行选择,这里大概介绍下二者之间的区别;

​ 2.2.1.YCSB工具原理和使用方法介绍

​ YCSB是雅虎开发的测试平台,主要的优点是可以做对比各个平台的性能,他拥有主流数据库的测试接口,包括Mongodb,HBase,Cassandra等;使用YCSB测试HBase的话,在测试的基本环境准备好以后,我们YCSB的client里面的文件夹下面大概有下面几个文件:

[ycsb-hbase10-binding-0.12.0-SNAPSHOT]# ll -l
总用量 52
drwxr-xr-x 2 root root   4096 9月   5 11:38 bin
drwxr-xr-x 2 root root   4096 9月   5 09:54 conf
drwxr-xr-x 2 root root   4096 9月   4 22:26 lib
-rw-r--r-- 1  501 games  8082 11月  9 2016 LICENSE.txt
-rw-r--r-- 1 root root  15489 9月   5 09:56 longtimetest
-rw-r--r-- 1  501 games   615 11月  9 2016 NOTICE.txt
-rw-r--r-- 1  501 games  5484 11月  9 2016 README.md
drwxr-xr-x 2  501 games  4096 9月   5 11:40 workloads

​ 上面的conf文件夹本来是没有的,但是这里是需要人为的加入相应的conf文件夹,这里的话,在conf文件夹下面是需要放入hbase-site.xml的配置文件,或者这个配置文件最好和服务端的配置文件一样,如果不一样至少也要保证zk的地址是一样的。

​ 在workloads里面有需要的各个相关的测试参数,下面以2个实际的case 解释下测试的各个参数的意思:

1.bin/ycsb load  hbase10 -P workloads/workloads  -p table=usertable -p columnfamily=cf  -p fieldlength=50 -p fieldcount=1 -s threads 50
2.bin/ycsb run  hbase10 -P workloads/workloada -p table=usertable -p columnfamily=cf -p fieldlength=1000 -p fieldcount=1  -s -threads 50
 [root@ ycsb-hbase10-binding-0.12.0-SNAPSHOT]# cat workloads/workloada
recordcount=1000
operationcount=1000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0.5
updateproportion=0.5
scanproportion=0
insertproportion=0

requestdistribution=zipfian

​ 上面case中,(1)表示的是使用ycsb load相关信息数据到hbase的数据库里面,实际上也就是写入部分数据到hbase中,-p 后面一般跟的是属性信息,包括table是usertable,columnfamily是cf ,写入的文件的长度是50B,写入1个文件,也就是一列。启动线程是50个线程做这么些事情;一共要写多少数据呢?在workloads/workloads这个文件里面会有一个recordcount ,这个表示的是写入的总共条数,当然这个参数也可以在命令行传输;

​ (2)表示的是开始执行run操作,run操作的类型主要是看workload/workloada里面的“readproportion”,“updateproportion”,“scanproportion”,“insertproportion”占用的比例,比如insertproportion=1,那就是写,如果insertproportion=0.5,readproportion=0.5 那么就是读写各50%,同理这个时候配置文件里面会有一个operationcount,表示需要操作的次数,这些操作次数里面读写各占50%。

requestdistribution 表示的是请求的分布类型,可以是类似正太分布,还是2/8请求分布,或者是别的分布。上面的zipfian表示2/8分布。

​ 此外,YCSB还有很多和HBase相关的参数配置,比如:写的时候的writeBufferSize,读的时候是否有setBlockCache等。
​ 2.2.2.HBase PerformanceEvaluation工具原理以及使用方法介绍

​ HBase PerformanceEvaluation 这个工具是HBase 自带的,测试的case 以及提供给外界的接口比YCSB 更丰富,比如提供了:RandomWrite,SequenceWrite,scan,randomSeekScan,scanRange10 ,scanRange100 等等。最直观的case,YCSB的直观的scan的case 就没有上述PE的丰富。我们本文中的测试的工具主要使用的是HBase Performance工具。我们以几个测试的实际case 来说明用法和相应的原理:

1.sh hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --writeToWAL=false --table=xxx --rows=50000 randomWrite 100
2.sh hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --writeToWAL=false --table=xxx --rows=50000 sequentialWrite 100
3.sh hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --writeToWAL=true --table=xxx --rows=50000 randomWrite 100
4.sh hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --writeToWAL=true --table=xxx --rows=50000 sequentialWrite
5.sh hbase  org.apache.hadoop.hbase.PerformanceEvaluation  --nomapred --table=xxx --rows=50000 randomRead 100
6.sh hbase  org.apache.hadoop.hbase.PerformanceEvaluation  --nomapred --table=xxx --rows=5000 --caching=100 scanRange100 100

​ 先来介绍用法,上述1-6个case 我们看到相关的参数,nomapred,writeToWAL, table, rows 以及各个randomWrite,sequentialWrite,scanRange100,等;下面列一个表大概介绍用法:

参数 意义
nommapred 默认使用本地启动mapreduce方式测试,如果有此参数,表示使用本地启动线程方式,非mr方式测试
table 测试的表名
rows 因为pe本地启动多线程的模式是,每一个线程需要操作一定的数量的key,这里后面跟操作的key的数量,默认是1024*1024
startRow 每个线程操作key的起始key,默认是0;当然,这里的key,实际到最终操作的row key 有点小区别,下面会说
compression 表对数据的压缩策略(lzo,gz,snappy,lz4,zstd,none几种策略),是在服务端的表没有的时候,这个参数是有意义的,默认是没有压缩
blockEncoding 表的data block的encoding策略: NONE; PREFIX; DIFF; FAST_DIFF; PREFIX_TREE,默认none
writeToWAL 写的时候Hlog的策略,有: SYNC_WAL 和 SKIP_WAL 2种,但是这里我们在测试的时候添加了一种新的ASYNC_WAL的方式,标志异步的flush wal ;这里原来的true标志sync_wal,false标志skip,我们改为false 标志位async_wal方式;
multiGet 标志get多条,在server端get多条需要的数据,然后返回;默认是0;单条get不受影响
columns 表示有多少个列,默认是1,我们这里使用默认的case
caching 表示在在服务端cache多少数据,然后一次拉回来;主要是scan的时候用到
randomWrite 上面说了每个线程发送对应的数据量的数据,从startRow开始到最终条数终止,每次的row key 以总共操作的rows随机出一个数字,row的总数是线程数*rows;row key 26byte
sequentialWrite 这里的row key 是以star row 开始,和这个数据是有相关性的,顺序key
randomRead 读的key是randowrite 一样,具有随机性
scan 给定指定的start row,开始scan,但是这里好像代码是只读到第一条key就返回,应该是个bug,我们已经改了 ,而且start row 每次应该读完需要变化
randomSeekScan 和上述的scan做对比,每一次读的star row是随机的,这里是读到最终的数据为止;
scanRange10 随机的指定范围的scan,scan的key的起止之间是10个;scanrang100是100个,依次类推

​ pe的大概的原理是:client启动线程池,线程池的上限线程是我们传递多少线程的参数,也就是各个case最后的100。然后会启动多个线程,每个线程并发的去执行rows次的读/写/scan操作;当然各个操作的类型是不一样的。

​ pe只是统计了整个流程下来消耗的平均时间以及各个线程的延时等信息,没有统计单位时间内这个server所处理的rps(request per second),我们这边修改了代码,统计该数据,大概的思路很简单,就是以所有线程并行操作的所有操作记录数count除以平均时间ts,得到的就是每秒这个sever处理的请求;

2.2.测试case:
写操作标志 写操作类型
sw1 顺序Batch100,ASYNC_WAL
sw2 顺序Batch100,SYNC_WAL
sw3 顺序Batch2 ,ASYNC_WAL
sw4 顺序Batch 2,SYNC_WAL
sw5 顺序写一条,ASYNC_WAL
sw6 顺序写一条,SYNC_WAL
rw1 随机Batch100,ASYNC_WAL
rw2 随机Batch 100,SYNC_WAL
rw3 随机Batch 2,ASYNC_WAL
rw4 随机Batch2,SYNC_WAL
rw5 随机写一条,ASYNC_WAL
rw6 随机写一条,SYNC_WAL
读操作标志 读操作
nr1 无cache命中,随机读一条
nr2 无cache命中,scan100条
yr1 cache命中近100%,随机读一条
yr2 cache命中近100%,scan100条

这里解释下上述测试case的意思:顺序/随机的意思是指:写入的row key的规律是随机性产生还是具有顺序特性;batch 100、2条等是指每次提交给服务端的key的条数。ASYNC_WAL/SYNC_WAL是指每次写操作下,服务端对于WAL 日志的处理是异步flush到文件系统,或者是同步flush到文件系统。无命中cache和命中cache主要是指这次读/scan的请求是否有命中cahce。

为了更好的对比数据,我们的两个版本的大部分参数都是用默认参数,比如这里的blockcache使用lrucache,size是默认大小。我们的表没有开启压缩,我们的minor compaction阈值没有做变化,等等。当然,这些详细的参数设置我们后面会有一篇单独的文章进行介绍,调优相关。

2.3.测试方法

​ 对于写操作:通过设置writeWAL可以设置写时候是如何操作write-ahead-logging的。对于随机还是顺序的设置key,主要是pe自己有这个接口。

​ 对于读操作:是否有cache的命中,无cahce的话,通过设置单表的blockcache选项是否是true,false,测试单表需要通过修改表的属性里面cache与否设置是否开启cache; cache的命中率的提高是通过预读多次,在监控中观测cache的命中率来做判断。 当观察到监控中的现象是cahce free size够大,且cache的hint percent是0/近100%的场景下,取到需要的测试结果。

​ 此外我们使用2个client进行测试,2个client是同一个az,为啥使用2client,因为单client的时候发现cpu容易打满,这个时候线程越多对client而言以及压力测试并不是好事,我们使用2个client分别测试,发现各100线程的时候,sever的性能表现比较不错,在某些场景下是可以把server的cpu/磁盘压榨的比较不错;此外个人认为单client 多线程和多client在分布式场景下效果相差不是很大。

3.测试结果

3.1.测试结果柱状图

​ 下面给出了随机写,顺序写以及随机读,scan 100条数据在各个背景下的性能情况,主要的输出数据有3个维度:rps(单秒的request请求),所有请求的平均延时,99延时;其中PE是多线程的请求,输出的数据给出各个线程的99延时,我们大概随机抽样了几条线程的99延时数据,这里主要输出的信息集中在rps和平均延时,这里的平均延时是多条线程并发请求sever以后处理完数据的各个线程的平均延时。此外这里还有一个地方需要注意下,对于scan的话,一次scan100条左右,所有我们最终统计的rps是在统计次数上乘以100作为大概的rps;但是scan下面的延时是每次的请求时延,对于get/write请求这个延时没有什么影响,单纯对scan操作做一个注释;此外cache的命中也不能保证100%,只是通过多次读取,达到cache命中的的可能性,所以上面写的是命中率近100%。

​ 3.1.1随机写

从数据结果来看,随机写情况下,BATCH 2条的性能和社区对比的话是比较不错的,性能有30%多的提升,这种情况下,网络消耗不会占很多,此外也不会像单条写那样消耗磁盘性能。

​ 3.1.2顺序写

​ 3.1.3.读/scan操作


scan的时候的命中率受到cache的大小影响以及scan的条数的影响,这里使用默认的blockcachesize,scan100条数据,这里存在部分数据会请求文件系统的可能性,这里需要说明下。

上面几个图分布展示了我们对阿里云HBase 以及HBase1.1.12的测试数据,通过数据我们可以看出,阿里云HBase在读、写、scan场景下的性能比社区HBase(1.1.12)的性能都要高很多,大部分场景下的性能超过30%的提高,某些场景下甚至超过100%;就读、写、scan的延时数据来看阿里云HBase的读写/scan延时普遍比社区HBase快,某些场景下近1倍的速度。从测试性能上面看,阿里云HBase的性能还是很不错的。此外,上述测试是单rs下的读写scan,整体性能具有线性扩展能力。

此外,我们也在测试ApsaraDB for HBase 和 HBase1.2.6的性能,后续会给出二者的测试报告和详细数据。

时间: 2024-10-03 22:59:38

ApsaraDB for HBase性能/延时全面领先社区版本的相关文章

使用社区版本pg_dump 逻辑备份导出 EDB PPAS 的风险

阿里云的PPAS产品是一个高度兼容Oracle数据库的产品,有些用户在使用的时候,会有将数据逻辑备份到本地,然后倒入到本地库的需求.但是PPAS既兼容PostgreSQL又兼容Oracle,用户使用PostgreSQL社区自带的pg_dump导出工具也能导出PPAS的数据.那么问题来了,使用pg_dump导出会有什么问题吗?PPAS为了兼容Oracle,自带了一些系统表,这些系统表在PostgreSQL中并不是系统表,pg_dump会把这些表的数据导出.例如dual表 sys | dual |

Visual Studio版本用社区版本可以吗?

问题描述 以前用过6.0的,不过好久没弄了最近项目要用到C#asp.net,搜索了下VisualStudio发现有好多版本,发现了VisualStudio版本用社区不知道如何. 解决方案 解决方案二:可以的,拿去用吧,我个人发现的区别是有个别控件在社区版没有,没什么大的区别.要知道,微软真的想在开发工具上面赚钱,那么等于是想弄死自己,他收费的目标是大企业.解决方案三:你官网看看,里面有三个版本的比较.解决方案四:试下安装了2015社区版本,要求系统还真高,解决方案五:社区版就是免费版本,但社区版

Centos7 开发环境安装mysql社区版本

1,Centos7安装 mysql 首先开发的服务器是centos7,上面默认安装的数据库是MariaDB. 还是有一点区别的.要安装mysql而且oracle提供的还是个社区版本. 无所谓,开发而已,装上就行. http://dbahire.com/how-to-install-mysql-5-6-on-centos-7/ yum install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm yum inst

OCE 0.6.0发布 OpenCascade三维内核的社区版本

OC++E(OpenCascade Community http://www.aliyun.com/zixun/aggregation/29806.html">Edition)是一个OpenCascade三维内核的社区版本,也是三维CAD开发的一个C++库.它是由三维表面和立方体BRep建模,可视化模块,数据交换(STEP,IGES),以及快速应用程序开发的组件组成.目前版本的OCE主要是修正错误,提高代码质量和可移植性. OpenCascade定义 Open CASCADE是一套开源的C

HBase性能调优

因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zookeeper.session.timeout默认值:3分钟(180000ms)说明:RegionServer与Zookeeper间的连接超时时间.当超时时间到后,ReigonServer会被Zookeeper从RS集群清单中移除,HMaster收到移除通知后,会对这台server负责的region

性能最高提升300%!阿里云数据库HBase版上线

阿里云正式推出云数据库HBase版(ApsaraDB forHBase),100%兼容HBase协议的分布式数据库,基于HDFS分布式文件系统,支持高达10PB的存储空间,满足最高5000W QPS的随机读写场景.能支撑海量结构化数据存储.高并发访问等需求,适用于物联网.车联网.监控.安全风控.即时通讯.消息存储等行业场景用户. 产品内核架构深度优化,运维效率大幅提升 阿里云数据库专家对原生HBase内核源码进行深度优化,让云数据库HBase版(ApsaraDB for HBase)的读写性能相

HBase数据库性能优化总结笔记

垃圾回收优化 master基本不会遇到垃圾回收的问题.由于memstore的刷写机制是不连续的,所以java虚拟机的堆内存会出现孔洞.快速刷写到磁盘的数据会被划分到新生代,这种空间会被优先回收数据停留的时间太长,会被划分到老生代甚至终生代.而且老生代和终生代一般占据了好几个G,而新生代一般就几百M而已 新生代空间由此得出新生代的空间一般的分配如下     -XX:MaxNewSize=128m -XX:NewSize=128m   可以缩写为     -Xmn128m   设定好之后观察是否合理

HBase的概念和性能选项

在本文中的HBase术语:基于列:column-oriented行:row列组:column families列:column单元:cell 理解HBase(一个开源的Google的BigTable实际应用)最大的困难是HBase的数据结构概念究竟是什么?首先HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式. Google's BigTable论文清楚地解释了什么是BigTable:Bigtable是一个疏松的分布式的持

大数据时代结构化存储云HBase技术架构及最佳实践

在10年,阿里研究HBase,是为了解决阿里容量及并发的实际问题,按照数据库要求,阿里深入HBase技术,并致力于保障稳定性和性能,目前已经有10000台规模,数百个集群,大约1亿的QPS,服务整个集团的业务.17年,把这部分能力也开放给公有云客户.本文中,阿里云高级专家封神带来了主题演讲<大数据时代结构化存储云HBase技术架构及最佳实践>,介绍HBase的应用选择.实战案例.技术平台解读以及后续的规划. 为什么应用HBase 一般而言,传统关系型数据库面临着成本.容量.QPS.分析等多方面