本次测试分为吞吐量对比测试与毛刺率对比测试。 吞吐量测试使用相同的线程数分别对社区版HBase和云HBase增强版进行对比测试,对比其吞吐量。 毛刺率测试使用相同的吞吐压力分别对社区版HBase和云HBase增强版进行对比测试,对比其毛刺率。 压缩率测试使用相同的数据写入社区版HBase和云HBase增强版进行对比测试,对比其压缩比。

在社区版HBase和云HBase增强版(Lindorm)集群中分别建表。所有case的表构造都相同,根据ycsb数据进行预分区,建表时预分200个分区。

云HBase增强版,使用独有的INDEX编码(当指定编码为DIFF时会自动升级为INDEX编码算法)和ZSTD压缩(参考其相关介绍),建表语句为:

create 'test', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'ZSTD'}, {SPLITS => (1..199).map{|i| "user#{(i * ((2**63-1)/199)).to_s.rjust(19, "0")}"} }

社区版HBase,使用官方推荐的DIFF编码和SNAPPY压缩,建表语句为:

create 'test', {NAME => 'f', DATA_BLOCK_ENCODING => 'DIFF', COMPRESSION => 'SNAPPY'}, {SPLITS => (1..199).map{|i| "user#{(i * ((2**63-1)/199)).to_s.rjust(19, "0")}"} }

数据准备

对于单行读和范围读场景,需要对读取的数据进行数据准备。

单表准备20亿行基础数据,每行数据20列,value为20byte。

ycsb的配置文件为

recordcount=2000000000
operationcount=150000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=20
fieldlength=20

readproportion=1.0
updateproportion=0.0
scanproportion=0
insertproportion=0

requestdistribution=uniform

启动命令为

bin/ycsb load hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -s

测试场景

吞吐量对比测试

吞吐量测试为在固定线程数条件下,对比社区版HBase与云HBase增强版本的吞吐能力差异。 一共有4个测试场景,每组测试场景均独立进行,测试场景之间没有前后依赖关系。

单行读场景

20亿行基础数据,每行数据20列,value为20byte,查询区间为1000万行。 上述数据准备完成后,触发其major_compaction并等待完成。 先进行预热测试20分钟,再进行20分钟的正式测试。

ycsb的workload配置如下:

recordcount=10000000
operationcount=2000000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=1
fieldlength=20

readproportion=1.0
updateproportion=0.0
scanproportion=0
insertproportion=0

requestdistribution=uniform

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -p maxexecutiontime=1200

范围读场景

20亿行基础数据,每行数据20列,value为20byte。查询区间为1000万行,每次范围读取50行。 上述数据准备完成后,触发其major_compaction并等待完成。 先进行预热测试20分钟,再进行20分钟的正式测试。

ycsb的workload配置如下:

recordcount=10000000
operationcount=2000000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=1
fieldlength=20

readproportion=0.0
updateproportion=0.0
scanproportion=1.0
insertproportion=0

requestdistribution=uniform
maxscanlength=50
hbase.usepagefilter=false

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=test -threads 100 -p columnfamily=f -p maxexecutiontime=1200

单行写场景

每次插入1列,value为20byte。执行20分钟测试

ycsb的workload配置如下:

recordcount=2000000000
operationcount=100000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=1
fieldlength=20

readproportion=0.0
updateproportion=0.0
scanproportion=0
insertproportion=1.0

requestdistribution=uniform

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -p maxexecutiontime=1200

批量写场景

每次插入1列,value为20byte,每次batch写入100行。执行20分钟测试:

recordcount=2000000000
operationcount=10000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
fieldcount=1
fieldlength=20
cyclickey=true

readallfields=false
readproportion=0
updateproportion=0
scanproportion=0
insertproportion=0.0
batchproportion=1.0
batchsize=100

requestdistribution=uniform

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=test -threads 100  -p columnfamily=f -p maxexecutiontime=1200

毛刺率对比测试

毛刺率对比测试为在固定OPS(Operation per second)的条件下,对比社区版HBase与云HBase增强版本的毛刺差别。

单行读场景

20亿行基础数据,每行数据20列,value为20byte,查询区间为1000万行。 OPS限制为5000 上述数据准备完成后,触发其major_compaction并等待完成。 先进行预热测试20分钟,再进行20分钟的正式测试。

ycsb的workload配置如下:

recordcount=10000000
operationcount=2000000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=1
fieldlength=20

readproportion=1.0
updateproportion=0.0
scanproportion=0
insertproportion=0

requestdistribution=uniform

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -p maxexecutiontime=1200 -p target=5000

范围读场景

20亿行基础数据,每行数据20列,value为20byte,查询区间为1000万行,每次范围读取50行。 OPS限制为5000 上述数据准备完成后,触发其major_compaction并等待完成。 先进行预热测试20分钟,再进行20分钟的正式测试。

ycsb的workload配置如下:

recordcount=10000000
operationcount=2000000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=1
fieldlength=20

readproportion=0.0
updateproportion=0.0
scanproportion=1.0
insertproportion=0

requestdistribution=uniform
maxscanlength=50
hbase.usepagefilter=false

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=test -threads 100 -p columnfamily=f -p maxexecutiontime=1200 -p target=5000

单行写场景

每次插入1列,value为20byte。执行20分钟测试 OPS限制为50000

ycsb的workload配置如下:

recordcount=2000000000
operationcount=100000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=1
fieldlength=20

readproportion=0.0
updateproportion=0.0
scanproportion=0
insertproportion=1.0

requestdistribution=uniform

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=testwrite -threads 200 -p columnfamily=f -p maxexecutiontime=1200 -p target=50000

批量写场景

每次插入1列,value为20byte,每次batch写入100行。执行20分钟测试: ops限制为2000

recordcount=2000000000
operationcount=10000000
workload=com.yahoo.ycsb.workloads.CoreWorkload
fieldcount=1
fieldlength=20
cyclickey=true

readallfields=false
readproportion=0
updateproportion=0
scanproportion=0
insertproportion=0.0
batchproportion=1.0
batchsize=100

requestdistribution=uniform

启动命令为

bin/ycsb run hbase10 -P <workload> -p table=testwrite -threads 100 -p columnfamily=f -p maxexecutiontime=1200 -p target=2000

压缩率对比测试

以下所有压缩率对比测试均使用同一测试流程。 通过ycsb写入500万行测试数据,手动触发flush与major_compaction并等待完成,统计其表大小。

每行列个数 每列value大小
1 10
1 100
20 10
20 20

ycsb的workload配置如下

recordcount=5000000
operationcount=150000000
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=false
fieldcount=<每行列个数>
fieldlength=<每列value大小>

readproportion=1.0

requestdistribution=uniform

写入数据命令为

bin/ycsb load hbase10 -P <workload> -p table=test -threads 200 -p columnfamily=f -s