❝
感谢您的**「关注 + 点赞 + 再看」**,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!!
❞
1.序篇-先说结论
大数据羊说
用数据提升美好事物发生的概率~
30篇原创内容
公众号
本文主要记录博主在生产环境中踩的 flink 针对 java enum serde 时的坑。
结论:在 flink 程序中,如果状态中有存储 java enum,那么添加或者删除 enum 中的一个枚举值时,就有可能导致状态恢复异常,这里的异常可能不是在恢复过程中会实际抛出一个异常,而是有可能是 enum A 的值恢复给 enum B。
我从以下几个章节说明、解决这个问题,希望能抛砖引玉,带给大家一些启发。
-
踩坑场景篇-这个坑是啥样的
-
问题排查篇-坑的排查过程
-
问题原理解析篇-导致问题的机制是什么
-
避坑篇-如何避免这种问题
-
总结篇
2.踩坑场景篇-这个坑是啥样的
对任务做一个简单的过滤条件修改,任务重新上线之后,从 flink web ui 确认是从 savepoint 重启成功了,但是实际最终产出的数据上来看却像是没有从 savepoint 重启。
逻辑就是计算分维度的当天累计 pv。代码很简单,在后面会贴出来。
如下图:
2
在 00:04 分重启时出现了当天累计 pv 出现了从零累计的情况。
但是预期正常的曲线应该张下面这样。
1
任务是使用 DataStream 编写(基于 flink 1.13.1)。
public class SenerioTest {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
env.addSource(new SourceFunction<SourceModel>() {
private volatile boolean isCancel = false;
@Override
public void run(SourceContext<SourceModel> ctx) throws Exception {
// 数据源
}
@Override
public void cancel() {
this.isCancel = true;
}
})
.keyBy(new KeySelector<SourceModel, Long>() {
@Override
publi