Day 8-10:State 状态
目标:懂为什么任务跑久了会 OOM、变慢。
1. 为什么需要状态
无状态算子:每条数据独立处理,没有记忆(如 map、filter)
有状态算子:需要访问历史数据才能计算出正确结果:
- 窗口聚合(需要累积一段时间的数据)
- 去重(需要记住之前见过哪些 key)
- Join(需要缓存一侧数据等待关联)
- 机器学习(在线更新模型参数)
2. Keyed State(最常用)
只能在 KeyedStream 中使用,每个 key 独立维护自己的状态。
2.1 ValueState(单值)
public class CountFunction extends KeyedProcessFunction<String, Event, Result> {
// 声明状态描述符(状态名 + 类型)
private ValueState<Long> countState;
@Override
public void open(Configuration parameters) {
ValueStateDescriptor<Long> desc =
new ValueStateDescriptor<>(\”count\”, Long.class);
countState = getRuntimeContext().getState(desc);
}
@Override
public void processElement(Event event, Context ctx, Collector<Result> out) throws Exception {
Long count = countState.value(); // 读取当前 key 的状态
if (count == null) count = 0L;
count++;
countState.update(count); // 更新状态
if (count >= 100)
