暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

RocksDB实战:概念介绍、安装部署、Java API读写示例

大数据从业者 2021-07-05
8887

概述

熟悉Flink和Kafka的朋友,使用它们时或者阅读源码时,肯定会多多少少见过RocksDB的身影。Flink流处理和Kafka流处理都支持RocksDB用作状态读写操作。本文主要介绍什么是RocksDB?如何安装RocksDB?Java如何使用内嵌式RocksDB?


什么是RocksDB?

RocksDB是由Facebook数据库工程团队基于LevelDB开发和维护的,旨在充分实现快存上存储数据的服务能力。RocksDB是一个可嵌入的(内嵌式使用不用专门安装部署RocksDB)、持久型的key-value存储代码库,特别适合在闪存驱动器上存储数据,Keyvalue是任意大小的字节流,支持原子的读和写。RocksDB采用LSM设计,在写放大因子(WAF)、读放大因子(RAF)和空间放大因子(SAF)之间进行了灵活的权衡。RocksDB支持多线程压缩,特别适合在单个数据库中存储TB级别的数据。

RocksDB支持在不同的生产环境(纯内存、Flashhard disks or HDFS)中调优,RocksDB针对多核CPU、高效快速存储(SSD)I/O boundworkload做了优化,支持不同的数据压缩算法、和生产环境debug的完善工具。



如何安装RocksDB?

注意:并非所有使用RocksDB场景都需安装RocksDB。

提前安装可能的依赖

    [root@felixzh1 opt]# yum -y install lrzszgit gcc gcc-c++ lz4-devel snappy snappy-devel zlib zlib-devel bzip2 bzip2-devellz4 lz4-devel zstd
    复制

    安装配置cmake

    下载cmake

      [root@felixzh1 opt]# wget https://cmake.org/files/v3.6/cmake-3.6.0-Linux-x86_64.tar.gz
      复制

      解压cmake

        [root@felixzh1 opt]# tar -zxvf cmake-3.6.0-Linux-x86_64.tar.gz
        复制

        配置cmake环境变量

           [root@felixzh1opt]# cat >>/etc/profile <<EOF
          > export PATH=\$PATH:/opt/cmake-3.6.0-Linux-x86_64/bin
          > EOF


          [root@felixzh1 opt]# source etc/profile
          复制

          安装配置gflags

          下载gflags

            [root@felixzh1 opt]# wget https://github.com/gflags/gflags/archive/v2.2.2.tar.gz
            复制

            解压gflags

              [root@felixzh1 opt]# tar -zxvfv2.2.2.tar.gz
              复制

              编译安装gflags

                [root@felixzh1 opt]# cd gflags-2.2.2/&& mkdir build && cd build/
                [root@felixzh1 build]# cmake-DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON-DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON .. && make
                [root@felixzh1 build]# make install
                复制


                配置gflags环境变量

                  [root@felixzh1 build]# cat>>/etc/profile <<EOF
                  > exportLD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib
                  > EOF
                  [root@felixzh1 build]# source etc/profile
                  复制

                  安装配置RocksDB

                  下载RocksDB

                    [root@felixzh1 build]# wgethttps://github.com/facebook/rocksdb/archive/v6.4.6.tar.gz && tar -zxvfv6.4.6.tar.gz && cd rocksdb-6.4.6/
                    复制

                    编译安装RocksDB

                      [root@felixzh1 rocksdb-6.4.6]# mkdir build&& cd build && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rocksdb.. && make && make install
                      复制

                      配置RocksDB环境变量

                        [root@felixzh1 build]# cat>>/etc/profile <<EOF
                        > exportCPLUS_INCLUDE_PATH=\$CPLUS_INCLUDE_PATH:/usr/local/rocksdb/include/
                        > exportLD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/rocksdb/lib64/
                        > export LIBRARY_PATH=\$LIBRARY_PATH:/usr/local/rocksdb/lib64/
                        > EOF
                        [root@felixzh1 build]# source etc/profile
                        复制

                        内置工具测试

                          [root@felixzh1 build]# cd/opt/rocksdb-6.4.6/build/tools/
                          [root@felixzh1 tools]# ./ldb –h
                          复制

                          创建数据库myRocksDB,并put数据

                            [root@felixzh1 tools]# ./ldb--db=/opt/myRocksDB --create_if_missing put felixzh_key felixzh_value
                            复制

                            scan数据库myRocksDB 

                              [root@felixzh1 tools]# ./ldb--db=/opt/myRocksDB scan
                              复制

                              get数据库myRocksDB中指定key

                                [root@felixzh1 tools]# ./ldb--db=/opt/myRocksDB get felixzh_key
                                复制

                                 查看数据文件

                                  [root@felixzh1 tools]# ll opt/myRocksDB/
                                  复制

                                   

                                  Java如何使用内嵌式RocksDB?

                                  RocksDB是一种C++开发的、嵌入式的Key:Value数据库,其实系统无需安装。支持C++Java两种语言API。这里只测试Java语言APIC++语言API见官网示例:https://rocksdb.org/docs/getting-started.html

                                  maven依赖

                                    <dependency>
                                        <groupId>org.rocksdb</groupId>
                                        <artifactId>rocksdbjni</artifactId>
                                        <version>6.6.4</version>
                                    </dependency>
                                    复制

                                    演示代码

                                      import org.rocksdb.Options;
                                      import org.rocksdb.RocksDB;
                                      import org.rocksdb.RocksIterator;


                                      public class RocksDBDemo {
                                      static {
                                      RocksDB.loadLibrary();
                                      }


                                      private static RocksDB rocksDB;


                                      private static String path = "/opt/myRocksDB";


                                      public static void main(String[] args) throws Exception {
                                      Options options = new Options();
                                      options.setCreateIfMissing(true);
                                      rocksDB = RocksDB.open(options, path);
                                      System.out.println("put: key is felixzh_key, value is felixzh_value");
                                      rocksDB.put("felixzh_key".getBytes(), "felixzh_value".getBytes());
                                      System.out.println("===================================");
                                      byte[] bytes = rocksDB.get("felixzh_key".getBytes());
                                      System.out.println("get: key is felixzh_key, value is " + new String(bytes));
                                      RocksIterator iter = rocksDB.newIterator();
                                      System.out.println("===================================");
                                      System.out.println("all key and value:");
                                      for (iter.seekToFirst(); iter.isValid(); iter.next()) {
                                      System.out.println("iter key: " + new String(iter.key()) + ",iter value: " +
                                      new String(iter.value()));
                                      }
                                      }
                                      }
                                      复制

                                      完整代码工程:https://github.com/felixzh2020/felixzh-learning-java

                                      注意:Windows下不可执行,异常如下:

                                      打包在linux运行(该主机无需安装RocksDB)

                                        [root@felixzh opt]# java -cpRocksDBCase-1.0-jar-with-dependencies.jar RocksDBDemo
                                        复制


                                        文章转载自大数据从业者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                        评论