Flink的状态 | 青训营笔记

117 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

1. 状态简介

流式计算分为有状态和无状态两种情况

1.1 无状态

  • 无状态流式处理分别接收每条数据记录(黑条),并根据最新输入的数据生成输出数据(白条)

image.png

1.2 有状态

  • 有状态流处理会维护状态,并根据最新输入的数据记录和当前的状态值生成输出数据

image.png

1.2.1 状态分类

  • Flink提供了两种基本状态:Keyed State(键控状态)和Operator State(算子状态)
    • 每种状态有两种存在形式:managed state(托管状态)和raw(原生状态)
状态类型 状态管理方式 状态的数据结构
Keyed State managed state ValueState、ListState、ReducingState、AggregatingState、FoldingState、MapState
raw state 字节数组:byte[]
Operator State managed state ListState、BroadcastState
raw state 字节数组:byte[]

2. 状态后端

状态存储的三种方式:

  • MemoryStateBackend(基于内存存储,默认的状态存储方式)

    • 将工作state保存在TaskManager的内存中,并将Checkpoint数据存储在JobManager的内存中

  • FsStateBackend(基于文件系统存储)

    • 将工作state保存在TaskManager的内存中,并将Checkpoint数据存储在文件系统中
    • 少量元数据会保存在JobManager内存中
    • 状态放在外边会有序列化和反序列化的过程
  • RocksDBStateBackend(基于RocksDB数据库存储)

    • 状态state先写入RocksDB,然后异步的将状态state写入文件系统

      • RocksDB数据库保存在TaskManager中
      • RocksDB是KV数据库,数据会先放在内存中,在一定条件下触发写到磁盘文件上
    • checkpoint时,整个RocksDB数据库的数据会快照一份,然后存到文件系统中

    • 少量元数据存在JobManager的内存中