简介
本文主要讲述Flink有状态的流处理中所提供的各种状态后端(state backend) 。本文将介绍Flink当前所提供的3种状态后端的优缺点以及在具体需求案例中如何去做选择。
在有状态的流处理(stateful-steam-processing)中,为了发生故障时能够完全恢复故障前的数据, 开发者通常会在使用Flink时设置checkpoint。在使用checkpoint时候,通常要涉及到状态后端的选择以决定持久化的状态的存储方式与位置。
Flink 当前提供了以下3种开箱即用的状态后端:
-
MemoryStateBackend
-
FsStateBackend
-
RocksDBStateBackend
在缺省情况下,Flink默认使用 MemoryStateBackend。
01 .不同 State backend 吞吐量对比
FileSystem(FsStateBackend)和Memory(MemoryStateBackend)的吞吐差异不大(都是使用TaskManager堆内存管理处理中的数据),使用 RocksDB 的吞吐差距明显。
Standalone 和 on Yarn 的总体差异不大,使用 FileSystem 和 Memory 时 on Yarn 模式下吞吐稍高,而使用 RocksDB 时 on Yarn 模式下的吞吐低些。
02 .不同 State backend 延迟对比
使用 FileSystem 和 Memory 时延迟基本一致且较低。
使用 RocksDB 时延迟稍高,且由于吞吐较低,在达到吞吐瓶颈附近延迟陡增。其中 on Yarn 模式下吞吐更低,延迟变化更加明显。\
03. State backend 的选择
StatBackend | in-flight | CP | 吞吐 | 推荐场景 |
MemoryState | TM Memory | JM Memory | 高 | 开发与调试、对数据丢失或重复不敏感 |
FsState | TM Memory | FS/ HDFS | 高 | 普通状态、大窗口、KV 结构 |
RocksDBState | RocksDB on TM | FS/ HDFS | 低 | 超大状态、超长窗口、大型 KV 结构 | <