1. 问题
select topic, count(*) from source_table group by topic
flink统计kafka 的topic 的实时数据量。如果不了解flink的状态,可能统计出来的结果不准确。
2. 处理过程
来了第一条数据, 生成状态 (topic,1), 并下发数据 (toipc,1)
来了第二条数据, 取回状态 (topic,1),自增1, 写回状态(topic,2),下发 数据(topic ,2)
来了第三条数据, 取回状态 (topic,2),自增1, 写回状态(topic,3),下发 数据(topic ,3)
为了提升性能,可以开启微批处理,不再一条数据处理一次,而是一批数据处理一次。只是提升性能, 处理流程还是可以理解成上面那样。
3. 问题引入
如果状态丢失会有什么结果? 再次从1 开始累计。
模拟状态丢失: topic 写入数据速率调低, flink状态保留时间调小,让状态被删除。
4.实验数据
- 刚开始,状态保留时间是1分钟, 每5秒写一条数据。结果符合预期。
- 之后, 状态保留时间是一分钟, 每120秒写一条数据。结果一直是1了, 而且数据前的标记是+I。 表示是新数据,即之前没有topic1这个key。
+----+--------------------------------+----------------------+
| op | topic | EXPR$1 |
+----+--------------------------------+----------------------+
| +I | topic1| 1 |
| -U | topic1| 1 |
| +U | topic1| 2 |
| -U | topic1| 2 |
| +U | topic1| 3 |
| -U | topic1| 3 |
| +U | topic1| 4 |
| -U | topic1| 4 |
| +U | topic1| 5 |
| -U | topic1| 5 |
| +U | topic1| 7 |
| +I | topic1| 1 |
| +I | topic1| 1 |
| +I | topic1| 1 |
| +I | topic1| 1 |
| +I | topic1| 1 |
| +I | topic1| 1 |