在使用RocksDB作为Flink中的状态后端时,如何创建快照来进行API调用?

时间:2020-07-26 17:13:27

标签: java apache-flink flink-streaming rocksdb

我想分析一下Flink对RocksDB进行的每个API调用所花费的时间。但是,我找不到那些功能。

我试图在IDE中设置Flink的完整源代码,将流式示例集成到源代码中,启动调试器并逐步进行许多调用,但徒劳无功。

这里是示例:

package org.apache.flink.streaming.examples.spendreport;

import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.walkthrough.common.entity.Alert;
import org.apache.flink.walkthrough.common.entity.Transaction;
import org.apache.flink.walkthrough.common.sink.AlertSink;
import org.apache.flink.walkthrough.common.source.TransactionSource;
import org.apache.flink.contrib.streaming.state.RocksDBStateBackend;

/**
 * Normal code.
 */
public class FraudDetectionAvi {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<Transaction> transactions = env
            .addSource(new TransactionSource())
            .name("transactions");

        env.enableCheckpointing(60000);
        env.setStateBackend(new RocksDBStateBackend("file:///home/avsrivas/dev/flink/checkpoints", true));

        DataStream<Alert> alerts = transactions
            .keyBy(Transaction::getAccountId)
            .process(new FraudDetectorAvi())
            .name("fraud-detector");

        alerts
            .addSink(new AlertSink())
            .name("send-alerts");

        env.execute("Fraud Detection");
    }
}

单击here获取完整的源代码。

我尝试进入执行,但是无法推断出调用RocksDB来保存状态的函数。

1 个答案:

答案 0 :(得分:1)

当RocksDB用作Flink应用程序的状态后端时,任何键分区状态的工作副本都存储在每个任务管理器中的本地嵌入式RocksDB实例中。计时器也可以保留在那里,或者它们可以在堆上。 RocksDB将其状态保存在本地磁盘上。非密钥状态始终在堆上。

拍摄快照时(即在检查点期间或获取保存点时),RocksDB中存储的状态(异步)复制到快照存储(应为分布式文件系统)。

例如,在您的应用程序中,当您调用flagState.update(true)时,它以here, in RocksDBValueState.java结尾,该代码使用以下代码写入RocksDB:

backend.db.put(columnFamily, writeOptions,
    serializeCurrentKeyWithGroupAndNamespace(),
    serializeValue(value));

稍后在快照过程中会发生什么情况取决于您使用增量检查点还是完全检查点,但是您可以在https://github.com/kebab-mai-haddi/flink/tree/master/flink-state-backends/flink-statebackend-rocksdb/src/main/java/org/apache/flink/contrib/streaming/state/snapshot中找到特定于RocksDB的代码。

请注意,快照未存储在RocksDB中。通过镜像SST文件来获取增量快照,而完整快照则涉及遍历状态后端中的所有状态并写出结果。

有关Flink如何使用RocksDB的更多信息,请搜索Stefan Richter的博客文章和Flink Forward演讲。