「Flink」RocksDB介紹以及Flink對RocksDB的支持


RocksDB介紹

RocksDB簡介

RocksDB是基於C++語言編寫的嵌入式KV存儲引擎,它不是一個分布式的DB,而是一個高效、高性能、單點的數據庫引擎。它是由Facebook基於Google開源的kv存儲LevelDB開發開發。RocksDB使用LSM存儲引擎。它針對不同的生產環境進行調優,可以直接使用內存、也可以使用Flash、或者用硬盤或者HDFS。而且支持不同的壓縮算法,有一整套的工具用於生產、調試使用。RocksDB是一種嵌入式、KV型、持久化的存儲。

使用嵌入式的數據存儲原因有很多,當數據頻繁訪問內存、或者存儲時,網絡延遲會增加響應時間。

RocksDB的主要應用場景

  1. 適應於多CPU場景
    • 一般的商業服務器有很多的CPU核,例如:志強E5系列 - 6核
    • RocksDB可以高效運行在多核服務器上
    • 它提供的RocksDB語義比傳統DBMS更簡單
  2. 高效利用存儲
    • RocksDB可以在快速存儲上高效運行且不會成為性能瓶頸
    • RocksDB采用LSM引擎,對比B-Tree引擎,它有更好的壓縮和更小的寫放大
  3. 彈性架構,支持擴展
  4. 支持IO-bound、in-memory、write-once

入門案例

為了簡單說明RocksDB,我們這里使用RocksDB的Java版本來編寫。

導入Maven依賴

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.rocksdb/rocksdbjni -->
        <dependency>
            <groupId>org.rocksdb</groupId>
            <artifactId>rocksdbjni</artifactId>
            <version>5.11.3</version>
        </dependency>
    </dependencies>

基於RocksDB讀寫數據

public class GettingStartDemo {
    // 因為RocksDB是由C++編寫的,在Java中使用首先需要加載Native庫
    static {
        // Loads the necessary library files.
        // Calling this method twice will have no effect.
        // By default the method extracts the shared library for loading at
        // java.io.tmpdir, however, you can override this temporary location by
        // setting the environment variable ROCKSDB_SHAREDLIB_DIR.
        // 默認這個方法會加壓一個共享庫到java.io.tmpdir
        RocksDB.loadLibrary();
    }

    public static void main(String[] args) throws RocksDBException {
        // 1. 打開數據庫
        // 1.1 創建數據庫配置
        Options dbOpt = new Options();
        // 1.2 配置當數據庫不存在時自動創建
        dbOpt.setCreateIfMissing(true);
        // 1.3 打開數據庫。因為RocksDB默認是保存在本地磁盤,所以需要指定位置
        RocksDB rdb = RocksDB.open(dbOpt, "./data/rocksdb");

        // 2. 寫入數據
        // 2.1 RocksDB都是以字節流的方式寫入數據庫中,所以我們需要將字符串轉換為字節流再寫入。這點類似於HBase
        byte[] key = "zhangsan".getBytes();
        byte[] value = "20".getBytes();

        // 2.2 調用put方法寫入數據
        rdb.put(key, value);
        System.out.println("寫入數據到RocksDB完成!");

        // 3. 調用delete方法讀取數據
        System.out.println("從RocksDB讀取key = " + new String(key) + "的value為" + new String(rdb.get(key)));

        // 4. 移除數據
        rdb.delete(key);

        // 關閉資源
        rdb.close();
        dbOpt.close();
    }
}

運行程序后,我們可以發現,在data/rocksdb文件夾中,生成了一下幾個文件:

image

  • 0000004.sst
    • sst是RocksDB的數據存儲文件,是二進制格式的
  • 0000006.log
    • log是預寫日志文件,LSM架構引擎都是有預寫日志的
  • CURRENT
    • CURRENT文件是一個文本文件,記錄最近的MANIFEST
  • IDENTITY
    • 存放當前rocksdb的唯一標識
  • LOCK
    • LOCK 進程的全局鎖,DB一旦被open, 其他進程將無法修改
  • LOG
    • rocksdb的操作日志文件, 可配置定期的統計信息寫入LOG. 可通過info_log_level調整日志輸出級別; 通過keep_log_file_num限制文件數量 等等。
  • LOG.old.15807….
  • MANIFECT-000005
    • 記錄rocksdb最近的狀態變化日志。其中包含manifest日志 和最新的文件指針
  • OPTIONS-000005
    • rocksdb的配置文件
  • OPTIONS-000008

Flink使用RocksDBBackend

1、導入Maven依賴

<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-statebackend-rocksdb_2.11</artifactId>
<version>1.9.0</version>
</dependency>

2、配置啟用RocksDBBackend

// 此處也可以是HDFS路徑,這里為了測試方便,所以使用的是本地路徑
env.setStateBackend(new RocksDBStateBackend("file:///D:/project/java8/data/rocksdb", true));



參考文獻:

RocksDB中文網:https://rocksdb.org.cn/

https://rocksdb.org.cn/doc/RocksJava-Basics.html

https://www.jianshu.com/p/2638e2b379c3

https://www.jianshu.com/p/3302be5542c7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM