HBase YCSB 测试(一)

测试环境

HMaster(40 Core 126 G 4.4 T) x 2 Java Heap 1G
HRegionServer (40 Core 126 G 4.4 T) x 3 Java Heap 31G Memstore 0.4 BlockCache 0.4
CDH:5.12.2
Hadoop:2.6.0-cdh5.12.2
HBase:1.2.0-cdh5.12.2
应用 CDH 默认配置

测试工具

YCSB(https://github.com/brianfrankcooper/YCSB/releases

  1. 下载 YSCB HBase 对应模块的测试包,解压到任意目录
  2. 将 hbase-xxx/lib 下的jar包全部拷贝至 ycsb-xxx/hbase-binding/lib
  3. 将 hbase 根目录下的jar包拷贝至ycsb-0.1.4/hbase-binding
  4. 将 hbase 中的 /conf/hbase-site.xml 拷贝到 /hbase-binding/conf
  5. 执行以下命令进行测试
bin/ycsb load hbase12 -P workloads/workloada -p table=t1 -p columnfamily=d -p recordcount=100
bin/ycsb run hbase12 -P workloads/workloada -p table=t1 -p columnfamily=d
bin/ycsb [load|run] dbname –P path/to/workloadfile –p key=value

测试完成后,YCSB 会打印平均/最小/最大延迟等信息

如果你在执行上述命令后出现以下报错:

ImportError: No module named argparse

是缺少 argparse 这个 python 模块,可以执行 sudo easy_install argparse 安装。

常用参数:

-threads        是模拟的线程数
-p              是传入的参数,可以是客户端的参数,可以是YCSB内部组件的参数
-target         指的是每秒最大操作数,当一秒内到达这个阈值,线程就会休眠1毫秒

recordcound             是YCSB load(加载元数据)命令的参数,默认值1000表示默认加载的记录条数,可以在命令行显示修改该值
Operationcount          是YCSB run(运行压力测试)命令的参数,默认值1000表示默认选取数据库中的1000条数据进行压力测试。对于workloada这种测试场景,就意味着读数据在500左右,写数据也在500左右
readallfields           表示查询时是否读取记录的所有字段
readproportion          表示读操作的比例,该场景为0.5
updateproportion        表示更新操作的比例,该场景为0.5
scanproportion          表示扫描操作的比例
Insertproportion        表示插入操作的比例
Requestdistribution     表示请求的分布模式,YCSB提供uniform, zipfian, latest三种分布模式

更多的参数含义可参考:https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads

环境准备

创建表

hbase(main):001:0>n_splits=256
hbase(main):002:0>create 't1',{NAME=>'d'},{SPLITS=>(1...n_splits).map{|i|"user#{1000000+i*(9999999-1000000)/n_splits}"}}
hbase(main):003:0>alter 't1',{MEMSTORE_FLUSHSIZE => '268435456', METADATA => {'COMPACTION_ENABLED' => 'false'}}

加载数据

./bin/ycsb load hbase12 -P workloads/workload_level1 -p table=t1 -p columnfamily=d -p recordcount=5000000 -threads 20

负载数据

./bin/ycsb run hbase12 -P workloads/workload_level1 -p table=t1 -p columnfamily=d -threads 20

数据存储

Rowkey 为用户 uid,读取/更新比例 600:400,少量插入,n = 30(模拟30天日活)
初始没有开启 Compaction,可能开启 Minor Compaction 的效率会更高

用户量
数量x平均大小
operation 初始 累计 Compact Compact 耗时
5,000,000 300 x 50 bytes 100,000 * n 91.5G 99.3G 91.5G 10min
20,000,000 500 x 50 bytes 200,000 * n 613.1G 615.2G 613.6G 1h
50,000,000 1000 x 50 bytes 500,000 * n 3.0T 3.1T 3.0T 8h 注意限制自动Split
100,000,000 2000 x 50 bytes 2,000,000 * n 12T 13T 12T 10h+

HFile 比较多的情况(5000万数据1000列的情况,256个Region,每个Region13G,140+的文件数量),服务器的文件描述符过高
Compaction 影响集群网络IO 150M/s,磁盘IO 200M/s

HFile 较大的情况下,Compaction 后每个 Region 的 HFile 达到10G超过默认的 Split 阈值(10G),会自动的 Split,导致 Split 和 Compaction 交替进行对集群影响很大。
集群节点多的情况下,可以提前创建多一些 Region。提高自动 Split 阈值。单个 RegionServer 上的 Region 不宜太多(100-200个左右)。

数据负载

50 个线程并发的统计数据(线程减少,读写延迟会有明显减少,吞吐量和 HBase 读写处理增加,插入比例增加会明显增大延迟,减少吞吐量)

数据量级 描述 CDH指标 YCSB指标
5,000,000 R:6 W:4 Read 24000/s
Write 16000/s
Throughoutput 111000/s
READ AverageLatency 340 us
UPDATE AverageLatency 700 us
INSERT AverageLatency 1800 us
5,000,000 R:0 W:10 Write 8800/s Throughoutput 21000/s
UPDATE AverageLatency 2400 us
5,000,000 Load Write 2700/s Throughoutput 8300/s
INSERT AverageLatency 5700 us
20,000,000 R:6 W:4 Read 22000/s
Write 14000/s
Throughoutput 100000/s
READ AverageLatency 350 us
UPDATE AverageLatency 700 us
INSERT AverageLatency 2500 us
20,000,000 R:0 W:10 Write 7900/s Throughoutput 10000/s
UPDATE AverageLatency 4957 us
20,000,000 Load Write 1800/s Throughoutput 5200/s
INSERT AverageLatency 9100 us
50,000,000 R:6 W:4 Read 15000/s
Write 10000/s
Throughoutput 72000/s
READ AverageLatency 700 us
UPDATE AverageLatency 690 us
INSERT AverageLatency 2100 us
50,000,000 R:0 W:10 Write 7000/s Throughoutput 9400/s
UPDATE AverageLatency 5300 us
50,000,000 Load Write 760/s Throughoutput 2200/s
INSERT AverageLatency 20927 us
100,000,000

Snapshot 的影响

在还没 Compaction 前做 Snapshot,最后一个 Snapshot 包含的数据会全部拷贝到 /hbase/archive/data/ 目录下。
多次的 Snapshot 和 Compaction 操作,/hbase/archive/data/ 目录下会有多份完整的 Snapshot 对应数据。
Snapshot 的删除是异步的。


Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注

20 − 12 =