本文主要记录在利用 YCSB 使用配置文件测试 RocksDB 的过程中遇到的一些问题以及相应的解决办法

简介

YCSB 的全程是 Yahoo! Cloud Serving Benchmark,是雅虎开发的用来对云服务进行基础测试的工具,支持目前常见的 NoSQL 数据库产品,如 HBase、MongoDB、OrientDB、Redis 等等

RocksDB 是一个具有键/值接口的存储引擎,其中键和值是任意字节流。它是在 Facebook(Meta) 基于 LevelDB 开发的,并为 LevelDB API 提供向后兼容的支持

编译 RocksDB

由于 YCSB 是用 Java 实现的,一般测试的数据库都需要提供 Java 版本的 .jar

虽然 RocksDB 最初是 C++ 的一个库(因为是嵌入式数据库),但是后续也提供了 Java 的 API 以及可以通过源码编译出 .jar 包,也可以直接通过 Maven 获取

官方在 GitHub 上给出了 Java 版本的介绍,编译过程也很简单

首先需要保证机器上安装好了 Java 的环境,必须在 1.7+ 版本以上,例如,安装 openjdk-8-jdk 包即可

sudo apt install openjdk-8-jdk

同时 RocksDB 本身还有一些环境需要安装,官方 也给出来了

sudo apt-get install libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev liblz4-dev libzstd-dev

实际编译 jar 包时,需要提前配置好环境变量

export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"

实际编译时,有两个中版本可以选择,其中 rocksdbjava 是 debug 版本,而 rocksdbjavastatic 这是 release 版本,不过官方在 Java 版说明中没有提及,我是在 Makefile 文件 中找到的

make -j$(nproc) rocksdbjava
make -j$(nproc) rocksdbjavastatic

编译 YCSB

YCSB 在 2019/10/17 的 4a99009 增加了对 RocksDB 配置文件的支持,然而目前官方给出的 release 版本还是 0.17.0,并且发布时间是 2019/10/6,因此我们只能选择从源码开始编译了

根据 官方给出的流程

git clone https://github.com/brianfrankcooper/YCSB.git
cd YCSB
mvn -pl site.ycsb:rocksdb-binding -am clean package

此时编译好的文件在 ./rocksdb/target/ 目录下

~/YCSB$ ls rocksdb/target/*.jar
rocksdb/target/rocksdb-binding-0.18.0-SNAPSHOT.jar

.jar 包其实只是 YCSB 和 RocksDB 之间的中间件,实际使用的 RocksDB 的 .jar 包以及其他的依赖包则是在 ./rocksdb/target/dependency/ 目录下

~/YCSB$ tree rocksdb/target/dependency/
rocksdb/target/dependency/
├── jcip-annotations-1.0.jar
├── rocksdbjni-6.2.2.jar
├── slf4j-api-1.7.25.jar
└── slf4j-simple-1.7.25.jar

RocksDB 的包其实是由 YCSB 通过 Maven 下载的,具体的版本在 pom.xml 中定义了

  • 如果使用原本 RocksDB 则可以简单的通过修改这个版本信息,重新编译利用 Maven 重新下载
  • 如果使用的是自己修改过源码的 RocksDB 则需要将自行编译的 RocksDB 的 .jar 包移到该目录下,并且删除旧的 .jar

修复报错

但此时如果使用 ./bin/ycsb.sh 来进行测试,会报错

~/YCSB$ ./bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=tmp/
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -classpath /home/ywang/YCSB/conf:/home/ywang/YCSB/core/target/core-0.18.0-SNAPSHOT.jar:/home/ywang/YCSB/rocksdb/target/rocksdb-binding-0.18.0-SNAPSHOT.jar:/home/ywang/YCSB/rocksdb/target/dependency/jcip-annotations-1.0.jar:/home/ywang/YCSB/rocksdb/target/dependency/rocksdbjni-6.2.2.jar:/home/ywang/YCSB/rocksdb/target/dependency/slf4j-api-1.7.25.jar:/home/ywang/YCSB/rocksdb/target/dependency/slf4j-simple-1.7.25.jar site.ycsb.Client -load -db site.ycsb.db.rocksdb.RocksDBClient -s -P workloads/workloada -p rocksdb.dir=tmp/
Command line: -load -db site.ycsb.db.rocksdb.RocksDBClient -s -P workloads/workloada -p rocksdb.dir=tmp/
YCSB Client 0.18.0-SNAPSHOT Loading workload...
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/htrace/core/Tracer$Builder
at site.ycsb.Client.getTracer(Client.java:458)
at site.ycsb.Client.main(Client.java:304)
Caused by: java.lang.ClassNotFoundException: org.apache.htrace.core.Tracer$Builder
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 2 more
(might take a few minutes for large data sets)

主要是使用的 ./bin/ycsb.sh 脚本有 bug,官方已经知道并尝试修复,不过好像仍然没有解决

目前可以手动将 htrace 的包的依赖加入 RocksDB 中,并重新编译,利用 Maven 下载到 ./rocksdb/target/dependency/ 目录下

可以手动将 ./core/pom.xmlhtrace 的依赖信息复制添加到 ./rocksdb/pom.xml

<!-- ./rocksdb/pom.xml -->
……
<dependency>
<groupId>org.rocksdb</groupId>
<artifactId>rocksdbjni</artifactId>
<version>${rocksdb.version}</version>
</dependency>
<dependency>
<groupId>org.apache.htrace</groupId>
<artifactId>htrace-core4</artifactId>
<version>4.1.0-incubating</version>
</dependency>
<dependency>
<groupId>site.ycsb</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
……

然后利用 mvn -pl site.ycsb:rocksdb-binding -am clean package 重新编译

这时再次利用 ./bin/ycsb.sh 来进行测试,还会报错

~/YCSB$ ./bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=tmp/
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -classpath /home/ywang/YCSB/conf:/home/ywang/YCSB/core/target/core-0.18.0-SNAPSHOT.jar:/home/ywang/YCSB/rocksdb/target/rocksdb-binding-0.18.0-SNAPSHOT.jar:/home/ywang/YCSB/rocksdb/target/dependency/htrace-core4-4.1.0-incubating.jar:/home/ywang/YCSB/rocksdb/target/dependency/jcip-annotations-1.0.jar:/home/ywang/YCSB/rocksdb/target/dependency/rocksdbjni-6.2.2.jar:/home/ywang/YCSB/rocksdb/target/dependency/slf4j-api-1.7.25.jar:/home/ywang/YCSB/rocksdb/target/dependency/slf4j-simple-1.7.25.jar site.ycsb.Client -load -db site.ycsb.db.rocksdb.RocksDBClient -s -P workloads/workloada -p rocksdb.dir=tmp/
Command line: -load -db site.ycsb.db.rocksdb.RocksDBClient -s -P workloads/workloada -p rocksdb.dir=tmp/
YCSB Client 0.18.0-SNAPSHOT Loading workload...
Starting test.
[Thread-3] INFO site.ycsb.db.rocksdb.RocksDBClient - RocksDB data dir: tmp
2021-12-25 16:10:30:807 0 sec: 0 operations; est completion in 0 second
DBWrapper: report latency for each error is false and specific error codes to track for latency are: []
Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/HdrHistogram/EncodableHistogram
at site.ycsb.measurements.Measurements.constructOneMeasurement(Measurements.java:129)
at site.ycsb.measurements.Measurements.getOpMeasurement(Measurements.java:220)
at site.ycsb.measurements.Measurements.measure(Measurements.java:188)
at site.ycsb.DBWrapper.measure(DBWrapper.java:184)
at site.ycsb.DBWrapper.insert(DBWrapper.java:229)
at site.ycsb.workloads.CoreWorkload.doInsert(CoreWorkload.java:621)
at site.ycsb.ClientThread.run(ClientThread.java:135)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.HdrHistogram.EncodableHistogram
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 8 more
2021-12-25 16:10:30:954 0 sec: 0 operations; est completion in 106751991167300 days 15 hours
[OVERALL], RunTime(ms), 170
[OVERALL], Throughput(ops/sec), 0.0
[TOTAL_GCS_PS_Scavenge], Count, 0
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 0
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.0
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 0
[TOTAL_GC_TIME], Time(ms), 0
[TOTAL_GC_TIME_%], Time(%), 0.0

原因和之前一样,再次将 HdrHistogram 相关的依赖,从 ./core/pom.xml 复制添加到 ./rocksdb/pom.xml

<!-- ./rocksdb/pom.xml -->
……
<dependency>
<groupId>org.rocksdb</groupId>
<artifactId>rocksdbjni</artifactId>
<version>${rocksdb.version}</version>
</dependency>
<dependency>
<groupId>org.apache.htrace</groupId>
<artifactId>htrace-core4</artifactId>
<version>4.1.0-incubating</version>
</dependency>
<dependency>
<groupId>org.hdrhistogram</groupId>
<artifactId>HdrHistogram</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>site.ycsb</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
……

然后利用 mvn -pl site.ycsb:rocksdb-binding -am clean package 重新编译

这时再次利用 ./bin/ycsb.sh 来进行测试就已经正常了

自定义配置 RocksDB 进行 YCSB 测试

自定义配置 RocksDB 的方式就很简单了,在 YCSB 测试时增加 rocksdb.optionsfile 参数并给出配置文件的路径即可

./bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=/tmp/ycsb-rocksdb-data -p workloads/ycsb-rocksdb-options.ini
./bin/ycsb.sh run rocksdb -s -P workloads/workloada -p rocksdb.dir=/tmp/ycsb-rocksdb-data -p workloads/ycsb-rocksdb-options.ini
  • 配置文件可以参考 RocksDB 官方的例子 修改
  • 也可以先不加测试文件,执行一次 ./bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=/tmp/ycsb-rocksdb-data,让 YCSB 自己生成,然后根据 RocksDB 测试目录(/tmp/ycsb-rocksdb-data)下的 OPTIONS-000009 的配置文件来修改

参考资料

本文作者: ywang_wnlo

本文链接: https://ywang-wnlo.github.io/posts/4bc1e607.html

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

【测试】自定义配置 RocksDB 进行 YCSB 测试的更多相关文章

  1. 【操作教程】利用YCSB测试巨杉数据库性能

    一.前言 巨杉数据库(SequoiaDB)是国内第一款新一代文档型分布式数据库,巨杉数据库由巨杉软件完全自主研发,拥有完全自主知识产权,不基于任何其它的开源项目.SequoiaDB数据库是为分布式存储 ...

  2. 使用YCSB测试mongodb

    项目里面需要对mongodb的性能进行测试,看了下网上很多做法都是使用YCSB进行测试,因此开始学习使用YCSB. 参考资料: YCSB github地址:https://github.com/bri ...

  3. 雅虎(ycsb)测试hbase(压测)

    一.下载ycsb 0.10包 https://github.com/brianfrankcooper/YCSB/releases/download/0.10.0/ycsb-0.10.0.tar.gz ...

  4. YCSB测试HBase远程完全分布式集群

    写在前面 本文只讲一个很简单的问题,YCSB对HBase集群的测试.虽然网上有很多介绍YCSB测试HBase的文章,但都是针对本地HBase伪分布式集群的.大家都知道,稍微正式一些的压测都会要求测试客 ...

  5. MySQL常用配置和性能压力测试:MySQL系列之十五

    一.MySQL常用配置 以下所有配置参数以32G内存的服务器为基 1.打开独立的表空间 innodb_file_per_table = 1 2.MySQL服务所允许的同时会话数的上限,默认为151,经 ...

  6. RocksDB存储引擎测试

    一:安装搭建(两个节点都要安装) yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-r ...

  7. vue cli3配置开发环境、测试环境、生产(线上)环境

    cli3创建vue项目是精简版的少了build和config这2个文件,所以配置开发环境.测试环境.生产环境的话需要自己创建env文件. 需要注意2点: 1.cli2创建项目生成的config文件里的 ...

  8. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  9. 《LDAP服务器的配置与客户端的测试》RHEL6——第一篇 运维工程师必考

    ldap这种原始的服务器搭建起来比较复杂,同时它也是CE必考的(客户端的搭建). 服务器端的配置: 1.安装openldap-servers软件包 2.查看ldap模板文件的存放位置: 3.拷贝lda ...

  10. API接口开发 配置、实现、测试

    Yii2 基于RESTful架构的 advanced版API接口开发 配置.实现.测试 环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到 ...

随机推荐

  1. pycharm-professional-2023 下载安装

    PyCharm Professional 是一款针对 Python 编程的集成开发环境 (IDE),由 JetBrains 公司开发和维护.它是 PyCharm 社区版的升级版,提供了更多的功能和工具 ...

  2. es 笔记二之基础查询

    本文首发于公众号:Hunter后端 原文链接:es笔记二之基础查询 这一篇笔记介绍 es 的基础查询. 基础查询包括很多,比如排序,类似数据库 limit 的操作,like 操作,与或非等,对于这些操 ...

  3. MySQL-DQL

    准备测试表,先跟着执行下面的SQL #1.登录MySQL后 #2.创建test_database数据库,不存在则创建 create database if not exists test_databa ...

  4. GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致. 本文分享自华为云社区<GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一 ...

  5. 一天吃透Spring面试八股文

    内容摘自我的学习网站:topjavaer.cn Spring是一个轻量级的开源开发框架,主要用于管理 Java 应用程序中的组件和对象,并提供各种服务,如事务管理.安全控制.面向切面编程和远程访问等. ...

  6. 适用于Linux命令的10个R函数

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 这篇文章将介绍 10 个不同的 Linux 命令及其 R 实现方法. 如果您有兴趣学习更多 R ...

  7. Redis数据结构:高频面试题及解析

    概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射. 键的类型只能为字符串,值支持五种数据类型:字符串.列表.集合.散列表.有序集合. Red ...

  8. [转载]C++ 入门教程(41课时) - 阿里云大学

    C++ 教程 C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ ...

  9. 前端vue uni-app基于uQRCode封装简单快速实用全端二维码生成插件

    快速实现基于uQRCode封装简单快速实用全端二维码生成插件; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12677 效果图 ...

  10. C# - XMLHelper :一个操作XML的简单类库

    下午写了一个操作XML文件的类库,后来不用了,水篇文章存个档 整体功能 XMLHelper.cs主要提供以下功能: 加载XML文件:从文件路径或字符串中加载XML文档,并返回XmlDocument对象 ...