1 介绍

使用YCSB测试rocksdb(自己修改的代码)的性能,运行环境:

操作系统:ubuntu 14.04

rocksdb的版本:5.18.3

YCSB的版本:0.15.0

2 rocksdb的jni包生成

2.1 rocksdb的版本代码

通过github获取rocksdb版本5.18.3的代码作为基础:

> git clone https://github.com/facebook/rocksdb.git

> cd rocksdb

> git tag # 查看发布的版本号,对应分支的标签

> git checkout v5.18.3 # 切换分支,查看当前分支 git branch 查看所有分支 git branch -a

> git checkout -b doycsb v5.18.3 # 创建复制分支v5.18.3为新的分支doycsb,方便修改v5.18.3的代码提交,当然最好的方法是先fork

2.2 rocksdb的java编译

rocksdb的文件夹中java文件夹便是生成jni包,由于我是在linux64位系统中运行,所以无需完成跨平台编译,压缩方式也无需5种(太多了下载过程可能会出错),只需要snappy压缩即可,修改rocksdb/Makefile:

ifneq ($(ROCKSDB_JAVA_NO_COMPRESSION), 1)

# JAVA_COMPRESSIONS = libz.a libbz2.a libsnappy.a liblz4.a libzstd.a

JAVA_COMPRESSIONS = libsnappy.a

endif

#JAVA_STATIC_FLAGS = -DZLIB -DBZIP2 -DSNAPPY -DLZ4 -DZSTD

JAVA_STATIC_FLAGS = -DSNAPPY

#JAVA_STATIC_INCLUDES = -I./zlib-$(ZLIB_VER) -I./bzip2-$(BZIP2_VER) -I./snappy-$(SNAPPY_VER) -I./lz4-$(LZ4_VER)/lib -I./zstd-$(ZSTD_VER)/lib/include

JAVA_STATIC_INCLUDES = -I./snappy-$(SNAPPY_VER)

使用make rocksdbjavastaticrelease 编译规则,找到该规则,取消vagrantd的跨平台,无需安装Vagrant和Virtualbox,即在rocksdbjavastaticrelease规则下,注释掉:

#cd java/crossbuild && vagrant destroy -f && vagrant up linux32 && vagrant halt linux32 && vagrant up linux64 && vagrant halt linux64

在rocksdb文件夹下,执行make rocksdbjavastaticrelease -j16,会出现如下错误:

cd java/target;jar -uf rocksdbjni-5.18.3.jar librocksdbjni-*.so librocksdbjni-*.jnilib

librocksdbjni-*.jnilib : no such file or directory

make: *** [rocksdbjavastaticrelease] Error 1

这是因为我们取消了跨平台java包,而.jnilib是mac os平台下的,所以只需把librocksdbjni-*.jnilib去掉即可:

cd java/target;jar -uf $(ROCKSDB_JAR_ALL) librocksdbjni-*.so

继续编译make rocksdbjavastaticrelease -j16。

jni包会生成在rocksdb/java/target/rocksdbjni-5.18.3.jar,后面会用到。

3 YCSB的编译与运行

3.1 YCSB的版本代码获取

> git clone https://github.com/brianfrankcooper/YCSB.git

> git checkout 0.15.0

3.2 YCSB的编译

> mvn -pl com.yahoo.ycsb:rocksdb-binding -am clean package

这是通过mvn下载rocksdb-binding模块的依赖包,千万不要直接mvn clean package,这将会下载所有数据库模块的依赖,耗时非常长。

可以在YCSB/pom.xml文件中看到5.11.3,这将会通过mvn在https://repo.maven.apache.org/maven2/org/rocksdb/rocksdbjni/中下载对应的5.11.3版本的jni包。如果不想要用自己的rocksdbjni包,可以直接修改对应版本,来获取新的版本的jni包。

3.2 YCSB的运行

YCSB的执行程序有三个:

bin/ycsb # python脚本,对应跨平台

bin/ycsb.sh # linux脚本,适合linux系统

bin/ycsb.bat # windows脚本,适合windows系统

我选择bin/ycsb.sh脚本来运行,执行:

> bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=/home/lzw/ceshi

其中rocksdb.dir是数据库路径,运行load 即加载数据,配置是workloads/workloada文件。

执行load命令的前段输出结果:

/usr/lib/jvm/jdk1.8.0_181/bin/java -classpath /home/lzw/ce_ycsb/YCSB/conf:/home/lzw/ce_ycsb/YCSB/core/target/core-0.15.0.jar:/home/lzw/ce_ycsb/YCSB/rocksdb/target/rocksdb-binding-0.15.0.jar:/home/lzw/ce_ycsb/YCSB/rocksdb/target/dependency/jcip-annotations-1.0.jar:/home/lzw/ce_ycsb/YCSB/rocksdb/target/dependency/rocksdbjni-5.11.3.jar:/home/lzw/ce_ycsb/YCSB/rocksdb/target/dependency/slf4j-api-1.7.25.jar:/home/lzw/ce_ycsb/YCSB/rocksdb/target/dependency/slf4j-simple-1.7.25.jar com.yahoo.ycsb.Client -load -db com.yahoo.ycsb.db.rocksdb.RocksDBClient -s -P workloads/workloada -p rocksdb.dir=/home/lzw/ceshi

这段运行命令很重要,这是classpath,即jni包,也可查看bin/ycsb.sh脚本的内容,这些jni包决定了运行的结果。

上面load运行结果会出现如下问题:

Loading workload...

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/htrace/core/Tracer$Builder

at com.yahoo.ycsb.Client.getTracer(Client.java:903)

at com.yahoo.ycsb.Client.main(Client.java:752)

Caused by: java.lang.ClassNotFoundException: org.apache.htrace.core.Tracer$Builder

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

... 2 more

这是由于YCSB的core模块的依赖缺少htrace-core4,可以查看YCSB/core/pom.xml文件,发现core模块的依赖都没有下载,将YCSB/core/pom.xml的内容:

org.apache.htrace

htrace-core4

4.1.0-incubating

添加到YCSB/rocksdb/pom.xml文件的标签下,然后运行:

> mvn -pl com.yahoo.ycsb:rocksdb-binding -am clean package

可以发现在YCSB/rocksdb/target/dependency/目录下新增了htrace-core4-4.1.0-incubating.jar。

继续运行load命令,会出现如下问题:

Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/HdrHistogram/EncodableHistogram

at com.yahoo.ycsb.measurements.Measurements.constructOneMeasurement(Measurements.java:129)

at com.yahoo.ycsb.measurements.Measurements.getOpMeasurement(Measurements.java:220)

at com.yahoo.ycsb.measurements.Measurements.measure(Measurements.java:188)

at com.yahoo.ycsb.DBWrapper.measure(DBWrapper.java:178)

at com.yahoo.ycsb.DBWrapper.insert(DBWrapper.java:223)

at com.yahoo.ycsb.workloads.CoreWorkload.doInsert(CoreWorkload.java:588)

at com.yahoo.ycsb.ClientThread.run(Client.java:468)

at java.lang.Thread.run(Thread.java:748)

Caused by: java.lang.ClassNotFoundException: org.HdrHistogram.EncodableHistogram

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

... 8 more

这个问题和上面的问题一样,缺少core模块的依赖HdrHistogram,将YCSB/core/pom.xml的内容:

org.hdrhistogram

HdrHistogram

2.1.4

添加到YCSB/rocksdb/pom.xml文件的标签下,然后运行:

> mvn -pl com.yahoo.ycsb:rocksdb-binding -am clean package

可以发现在YCSB/rocksdb/target/dependency/目录下新增了HdrHistogram-2.1.4.jar。

运行load命令:

> bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=/home/lzw/ceshi

终于可以正常运行了,在数据库路径下的LOG文件开头可以看到RocksDB version: 5.11.3,代表运行的是rocksdb v5.11.3。

将上一步生成的 rocksdb/java/target/rocksdbjni-5.18.3.jar复制到YCSB/rocksdb/target/dependency/目录下,然后把rocksdbjni-5.11.3.jar删除。

然后删除数据库路径下的文件,即删除原有的数据库。

运行load命令:

> bin/ycsb.sh load rocksdb -s -P workloads/workloada -p rocksdb.dir=/home/lzw/ceshi

可以在数据库路径下的LOG文件开头可以看到RocksDB version: 5.18.3,代表运行的是rocksdb v5.18.3。

运行run命令:

> bin/ycsb.sh run rocksdb -s -P workloads/workloada -p rocksdb.dir=/home/lzw/ceshi

4 YCSB下的rocksdb参数设置

最简单的配置是workloads/workloada类似文件的配置,运行load的命令是简单地将recordcount=1000的条数插入数据库,而插入数据库的数据大小则是:

fieldcount=10 (默认)

fieldlength=100 (默认)

fieldcount表示一条记录有多少段,fieldlength表示一段的字节数,插入的一条数据value约等于fieldcount*fieldlength。

YCSB中连接rocksdb客户端的文件:

YCSB\rocksdb\src\main\java\com\yahoo\ycsb\db\rocksdb\RocksDBClient.java

YCSB中测试rocksdb的文件:

YCSB\rocksdb\src\test\java\com\yahoo\ycsb\db\rocksdb\RocksDBClientTest.java

在RocksDBClient.java文件中:

位于initRocksDB()函数中:

final Options options = new Options()

.optimizeLevelStyleCompaction()

.setCreateIfMissing(true)

.setCreateMissingColumnFamilies(true)

.setIncreaseParallelism(rocksThreads)

.setMaxBackgroundCompactions(rocksThreads)

.setInfoLogLevel(InfoLogLevel.INFO_LEVEL);

final DBOptions options = new DBOptions()

.setCreateIfMissing(true)

.setCreateMissingColumnFamilies(true)

.setIncreaseParallelism(rocksThreads)

.setMaxBackgroundCompactions(rocksThreads)

.setInfoLogLevel(InfoLogLevel.INFO_LEVEL);

位于createColumnFamily()函数中:

final ColumnFamilyOptions cfOptions = new ColumnFamilyOptions().optimizeLevelStyleCompaction();

这两处都会对rocksdb的option产生影响,特别是rocksdb中的optimizeLevelStyleCompaction()函数,优化了多个参数。rocksdb中的参数结果会保存在数据库路径下的OPTIONS文件下。

如果修改了RocksDBClient.java文件的内容,可以再次编译YCSB:

> mvn -pl com.yahoo.ycsb:rocksdb-binding -am package

去掉clean,则不会将原来的rocksdb/java/target/rocksdbjni-5.18.3.jar删除。只会重新下载package,将新下载的rocksdb/java/target/rocksdbjni-5.11.3.jar删除即可。

java连接rocksdb_rocksdb在YCSB中的运行教程相关推荐

  1. jsp+ssm+mysql实现的Java web家庭理财管理系统源码+运行教程+参考论文+开题报告

    今天给大家演示的是一款由jsp+ssm+mysql实现的Java web家庭理财管理系统,用户分为系统管理员和普通用户两个角色,普通用户可自行注册登录,系统管理员可以管理所有数据,普通用户只能管理自己 ...

  2. java 内存情况_Java代码中获取运行时内存情况

    在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...

  3. [ES7版本系列(二)] Java连接ElasticSearch向索引中插入新的数据

    1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 高级别API来创建客户端 <!-- https://mvnreposi ...

  4. java连接mysql表格_java中表格连接数据库

    try{Stringurl="jdbc:mysql://localhost:3306/book?";Class.forName("com.mysql.jdbc.Drive ...

  5. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

  6. Java面试-2021Gaoven-持续更新中

    Java面试 一.基础 1.&&和&的区别? |和||的区别? 1.当符号左边是false时,&继续执行符号右边的运算.&&不再执行符号右边的运算. 2 ...

  7. mysql连接java程序_实现Java连接mysql

    Java连接mysql数据库,代码经过运行准确无误. 下面为实例----> 用数据库操纵工具(例: SQLyogEnt)操纵mysql建表,或dos下建,如下: 数据库名:scutcs 表名:s ...

  8. Java连接SQL2005及SQL Server JDBC Driver 2.0中sqljdbc.jar和sqljdbc4.jar的区别

    第一.Java连接SQL2005 一.JAVA连接SQL的语句 JAVA连接SQL2000语句为: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver&q ...

  9. 分享Java 中如何运行字符串表达式?

    2019独角兽企业重金招聘Python工程师标准>>> 在日常的开发中,偶尔会遇到运行字符串表达式的情况,通常这样的需求会对需求进行进一步分析,然后进行进一步 "特殊化&q ...

最新文章

  1. 在别的电脑上运行cg程序出现错误的解决办法
  2. JS获取当天零点或23:59:59的时间
  3. get与post请求问题
  4. leetcode645. 错误的集合
  5. 转豆瓣--梁海棠尽管死了,但却占领了陈少杰的身心。乔燕尽管还…
  6. java剑指offer_剑指offer题目java实现
  7. 一个函数返回参数二进制中1的个数
  8. python爬虫入门案例,持续更新
  9. IT技术分享的一点点总结
  10. php windows挂掉,宕机是什么意思
  11. 出方向链路负载均衡技术(原理部分)
  12. plc实验报告流程图_plc实验报告
  13. 报错:java.net.bindexception: address already in use: jvm_bind:8082
  14. Linux 之父是个果粉:给自用 M2 Mac 装上 Fedora Linux,除图形加速和 Chrome 都搞定了...
  15. 使用路由守卫来写登录效果
  16. 如何改typecho主题头像_如何搭建hexo个人博客
  17. 编译原理 - 学习/实践
  18. html5中的空格怎么写,空格的代码(【html5空格代码怎么写】)
  19. 使用opencv-python对视频与图像进行相互转换
  20. 磁盘与虚拟磁带库优缺点分析

热门文章

  1. xming登录linux图形中文乱码,putty+xming远程登录Linux图形界面
  2. 如何申请成为社区的YY讲师?
  3. yy部分地区服务器维护中,上午和大家在YY里聊了一上午服务器最终没设置密码,总结一下啊...
  4. 我们追捧的股权激励激励真的没有问题吗?
  5. 书读得越多,是不是变得越聪明?
  6. CSV和XLSX文件格式的区别
  7. Oracle 数据库操作
  8. 何恺明团队12页论文新作剑指AIGC!“新CLIP”只需一个trick,训练速度快3.7倍!性能不降反升...
  9. xmapp安装、配置及dreamweaver站点建立
  10. android签名图片不显示,android手写签名遇见bitmap黑屏和本地html插入签名图片