一、state 文件格式
### --- state文件格式
~~~ 当我们创建 state 时,数据是如何保存的呢?
~~~ 对于不同的 statebackend,有不同的存储格式。
~~~ 但是都是使用 flink 序列化器,将键值转化为字节数组保存起来。
~~~ 这里使用 RocksDBStateBackend 示例。
~~~ 每个 taskmanager 会创建多个 RocksDB 目录,每个目录保存一个 RocksDB 数据库;
~~~ 每个数据库包含多个 column famiilies,这些 column families 由 state descriptors 定义。
~~~ 每个 column family 包含多个 key-value 对,key 是 Operator 的 key, value 是对应的状态数据。
二、state文件格式编程实现
### --- state文件格式编程实现
~~~ # TestFlink.java
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
ParameterTool configuration = ParameterTool.fromArgs(args);
FlinkKafkaConsumer010<String> kafkaConsumer010 = new
FlinkKafkaConsumer010<String>("test", new SimpleStringSchema(), getKafkaConsumerProperties("testing123"));
DataStream<String> srcStream = env.addSource(kafkaConsumer010);
Random random = new Random();
DataStream<String> outStream = srcStream
.map(row -> new KeyValue("testing" + random.nextInt(100000), row))
.keyBy(row -> row.getKey())
.process(new StatefulProcess()).name("stateful_process").uid("stateful_process")
.keyBy(row -> row.getKey())
outStream.print();
env.execute("Test Job");
}
public static Properties getKafkaConsumerProperties(String groupId){
Properties props = new Properties();
props.setProperty("bootstrap.servers", "localhost:9092"