『大数据程序员工程师』Flink状态后端和如何管理Kafka消费偏移量,有状态流处理:Apache

有状态流处理:ApacheFlink状态后端
ApacheFlink的3个状态后端 , 它们的局限性以及何时根据特定于案例的要求使用它们 。
通过有状态流处理 , 当开发人员启用Flink应用程序的检查点时 , 状态将持续存在以防止数据丢失并确保在发生故障时完全恢复 。 为应用程序选择状态后端将影响状态持久化的方式和位置 。
了解管理ApacheFlink状态和开发有状态流应用程序的实际示例 。
ApacheFlink附带三个可用的状态后端:MemoryStateBackend , FsStateBackend和RocksDBStateBackend 。
『大数据程序员工程师』Flink状态后端和如何管理Kafka消费偏移量,有状态流处理:Apache
文章图片
该MemoryStateBackend
MemoryStateBackend是一个内部状态后端 , 用于维护Java堆上的状态 。 键/值状态和窗口运算符包含存储值和计时器的哈希表 。
当您的应用程序检查点时 , 此后端将在您将状态发送到ApacheFlink的作业管理器之前拍摄您的状态的快照 , 该作业管理器也将其存储在Java堆上 。
默认情况下 , MemoryStateBackend配置为支持异步快照 。 异步快照可避免可能导致流应用程序背压的潜在阻塞管道 。 使用MemoryStateBackend时需要注意什么:
默认情况下 , 每个单独的状态的大小默认为5MB 。 您可以在MemoryStateBackend构造函数中进一步增加大小 。
状态大小受akka帧大小的限制 , 无论您在配置中设置为最大状态大小 , 都不能大于akka帧大小(您可以在配置中找到更多信息) 。
聚合状态必须适合JobManager内存 。 何时使用MemoryStateBackend:
建议使用MemoryStateBackend进行本地开发或调试 , 因为它的状态有限
MemoryStateBackend最适合具有小状态大小的用例和有状态流处理应用程序 , 例如仅包含一次记录功能(Map , FlatMap或Filter)的作业或使用Kafka使用者 。
该FsStateBackend
FsStateBackend配置使用文件系统完成 , 例如URL(类型 , 地址 , 路径) 。 一些示例文件系统可能是:
“hdfs://namenode:40010/flink/checkpoints”或
“s3://flink/checkpoints”.
当您选择FsStateBackend时 , 正在进行的数据保存在任务管理器的内存中 。 在检查点上 , 此后端将状态快照写入配置的文件系统和目录中的文件 , 同时它将在JobManager的内存或Zookeeper中存储最少的元数据(对于高可用性情况) 。
默认情况下 , FsStateBackend配置为提供异步快照 , 以避免在写入状态检查点时阻塞处理管道 。 可以通过将构造函数中相应的布尔标志设置为false来实例化FsStateBackend来禁用该功能 , 例如:
1
newFsStateBackend(path,false);何时使用FsStateBackend:
FsStateBackend最适合处理大状态 , 长窗口或大键/值状态的ApacheFlink有状态流处理作业 。
FsStateBackend最适合每个高可用性设置 。 该RocksDBStateBackend
使用文件系统(类型 , 地址 , 路径)执行RocksDBStateBackend的配置 , 如下例所示:
“hdfs://namenode:40010/flink/checkpoints”或
“s3://flink/checkpoints”
RocksDBStateBackend使用RocksDB数据库在本地磁盘上保存飞行中的数据 。 在检查点上 , 整个RocksDB数据库将被检查点到配置的文件系统中 , 或者在非常大的状态作业的情况下增量差异 。 同时 , ApacheFlink将一些最小的元数据存储在JobManager的内存或Zookeeper中(对于高可用性情况) 。 RocksDB默认配置为执行异步快照 。 使用RocksDBStateBackend时需要注意什么:
RocksDB的每个密钥和每个值的最大支持大小为每个2^31个字节 。 这是因为RocksDB的JNI桥API基于byte[] 。
我们需要在此强调 , 对于使用具有合并操作的状态(例如ListState)的有状态流处理应用程序 , 可以累积超过2^31字节超时的值大小 , 这将导致它们在任何后续检索时失败 。 何时使用RocksDBStateBackend: