【Flink】基于 Flink 的流式数据实时去重
State Backends | Apache Flink https://nightlies.apache.org/flink/flink-docs-release-1.20/zh/docs/dev/datastream/fault-tolerance/state_backends/
Flink 提供了多种 state backends,它用于指定状态的存储方式和位置。
状态可以位于 Java 的堆或堆外内存。取决于你的 state backend,Flink 也可以自己管理应用程序的状态。 为了让应用程序可以维护非常大的状态,Flink 可以自己管理内存(如果有必要可以溢写到磁盘)。 默认情况下,所有 Flink Job 会使用 Flink 配置文件 中指定的 state backend。
【Flink】基于 Flink 的流式数据实时去重-腾讯云开发者社区-腾讯云 https://cloud.tencent.com/developer/article/1707045
我们不能将状态仅交由内存管理,因为内存的容量是有限制的,当状态数据稍微大一些时,就会出现内存不够的问题。由于 Flink 本身提供了有状态的计算,并且封装了一些底层的实现,比如状态的高效存储、Checkpoint 和 Savepoint 持久化备份机制、计算资源扩缩容等问题,所以我们只需要调用 Flink API,专注于业务逻辑即可。
2.状态类型
Managed State 和 Raw State
Flink有两种基本类型的状态:托管状态(Managed State)和原生状态(Raw State)。从名称中也能读出两者的区别:Managed State 是由 Flink 管理的,Flink 帮忙存储、恢复和优化,Raw State 是开发者自己管理的,需要自己序列化。两者对比如下:
Managed State |
Raw State | |
---|---|---|
状态管理方式 |
Flink Runtime 托管,自动存储、自动恢复、自动伸缩 |
用户自己管理 |
状态数据结构 |
Flink提供的常用数据结构,如 ListState、MapState 等 |
字节数组:byte[] |
使用场景 |
绝大多数 Flink 算子 |
用户自定义算子 |
大部分情况下我们使用 Managed State 便可满足需求。