Flink State 误用之痛,你中招了吗?

本文深入探讨了Flink中MapState和ValueState的使用区别,特别是在性能和TTL方面。在RocksDB场景下,MapState性能优于ValueState,特别是处理大对象时,ValueState可能造成CPU负载过高。Heap State场景下,两者性能相当。在TTL机制下,MapState的TTL基于每个键值对,而ValueState基于整个键。建议在需要存储Map时优先选择MapState。
摘要由CSDN通过智能技术生成

1、 结论

从性能和 TTL 两个维度来描述区别。

性能

  • RocksDB 场景,MapState 比 ValueState 中存 Map 性能高很多。
  • 生产环境强烈推荐使用 MapState,不推荐 ValueState 中存大对象
  • ValueState 中存大对象很容易使 CPU 打满
  • Heap State 场景,两者性能类似。

TTL

Flink 中 State 支持设置 TTL:

  • MapState 的 TTL 是基于 UK 级别的
  • ValueState 的 TTL 是基于整个 key 的

举一反三

能使用 ListState 的场景,不要使用 ValueState 中存 List。大佬们已经把 MapState 和 ListState 性能都做了很多优化,高性能不香吗?下文会详细分析 ValueState 和 MapState 底层的实现原理,通过分析原理得出上述结论。

2、 State 中要存储哪些数据

ValueState 会存储 key、namespace、value,缩写为 。MapState 会存储 key、namespace、userKey、userValue,缩写为 。

解释一下上述这些名词。

Key

ValueState 和 MapState 都是 KeyedState,也就是 keyBy 后才能使用 ValueState 和 MapState。所以 State 中肯定要保存 key。

例如:按照 app 进行 keyBy,总共有两个 app,分别是:app1 和 app2。那么状态存储引擎中肯定要存储 app1 或 app2,用于区分当前的状态数据到底是 app1 的还是 app2 的。

这里的 app1、app2 也就是所说的 key。

Namespace

Namespace 用于区分窗口。

假设需要统计 app1 和 app2 每个小时的 pv 指标,则需要使用小时级别的窗口。状态引擎为了区分 app1 在 7 点和 8 点的 pv 值,就必须新增一个维度用来标识窗口。

Flink 用 Namespace 来标识窗口,这样就可以在状态引擎中区分出 app1 在 7 点和 8 点的状态信息。

Value、UserKey、UserValue

ValueState 中存储具体的状态值。也就是上述例子中对应的 pv 值。MapState 类似于 Map 集合,存储的是一个个 KV 键值对。为了与 keyBy 的 key 进行区分,所以 Flink 中把 MapState 的 key、value 分别叫 UserKey、UserValue。

下面讲述状态引擎是如何存储这些数据的。

3、StateBackend 如何存储和读写State 数据

Flink 支持三种 StateBackend,分别是:Me

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值