踩坑记| flink state 序列化 java enum 竟然岔劈了

本文记录了在Flink程序中遇到的关于Java枚举状态序列化问题,详细描述了问题场景、排查过程、问题原因及避免此类问题的方法。在Flink中,对enum进行序列化时,如果增删enum值,可能导致状态恢复异常。解决方案包括谨慎调整枚举值顺序或改用非枚举类型存储状态。
摘要由CSDN通过智能技术生成

图片

感谢您的**「关注  +  点赞 + 再看」**,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!!

1.序篇-先说结论

大数据羊说

大数据羊说

用数据提升美好事物发生的概率~

30篇原创内容

公众号

本文主要记录博主在生产环境中踩的 flink 针对 java enum serde 时的坑。

结论:在 flink 程序中,如果状态中有存储 java enum,那么添加或者删除 enum 中的一个枚举值时,就有可能导致状态恢复异常,这里的异常可能不是在恢复过程中会实际抛出一个异常,而是有可能是 enum A 的值恢复给 enum B。

我从以下几个章节说明、解决这个问题,希望能抛砖引玉,带给大家一些启发。

  1. 踩坑场景篇-这个坑是啥样的

  2. 问题排查篇-坑的排查过程

  3. 问题原理解析篇-导致问题的机制是什么

  4. 避坑篇-如何避免这种问题

  5. 总结篇

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值