1. 程式人生 > 實用技巧 >「Flink」RocksDB介紹以及Flink對RocksDB的支援

「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資料夾中,生成了一下幾個檔案:

  • 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