Flink demo代码

Flink流任务,用于checkpoint问题验证

java 复制代码
public class StreamDemo {

    public static void main(String[] args) throws Exception {
        // 1. 创建执行环境
//        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamExecutionEnvironment env = StreamExecutionEnvironment
                .createLocalEnvironmentWithWebUI(new Configuration());

        // 2. 设置并行度
        env.setParallelism(1);

        // 3. 启用Checkpoint(使作业可以长期运行)
        env.enableCheckpointing(5000); // 5秒一次
        env.getCheckpointConfig().setCheckpointStorage("file:////Users/wangqin/IdeaProjects/MyFlinkCode/checkpoint");
        CheckpointConfig checkpointConfig = env.getCheckpointConfig();
        checkpointConfig.setExternalizedCheckpointCleanup(
                CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION
        );

        env.getCheckpointConfig().setTolerableCheckpointFailureNumber(0);

        // 4. 创建无限数据源(一直产生数据)
        DataStream<String> infiniteStream = env.addSource(new InfiniteSource()).setParallelism(4);

        // 5. 简单的数据处理
        infiniteStream
                .map(value -> "处理数据: " + value + ", 时间: " + System.currentTimeMillis())
                .print();

        // 6. 执行作业(会一直运行)
        env.execute("Infinite Stream Job");
    }

    /**
     * 自定义无限数据源
     * 每秒生成一个随机数,一直运行
     */
    public static class InfiniteSource extends RichParallelSourceFunction<String> implements CheckpointedFunction {
        private volatile boolean isRunning = true;
        private long count = 0;

        @Override
        public void run(SourceContext<String> ctx) throws Exception {
            while (isRunning) {
                // 每秒生成一个数据
                String data = "随机数-" + (int)(Math.random() * 100) + "-计数-" + (count++);
                ctx.collect(data);

                // 控制数据生成速度:每秒1条
                Thread.sleep(1000);

                // 每10条数据打印一次日志
                if (count % 10 == 0) {
                    System.out.println("[Source] 已生成 " + count + " 条数据,继续运行中...");
                }
            }
        }

        @Override
        public void cancel() {
            isRunning = false;
            System.out.println("数据源已停止");
        }

        @Override
        public void snapshotState(FunctionSnapshotContext functionSnapshotContext) throws Exception {
            int subtaskIndex = getRuntimeContext().getIndexOfThisSubtask();
            System.out.println("subtaskIndex is" + subtaskIndex);
//            if (subtaskIndex == 0) {
//                Thread.sleep(10000);
//                throw new RuntimeException("checkpoint failed");
//            }
            if (functionSnapshotContext.getCheckpointId() % 3 == 0) {
                throw new RuntimeException("checkpoint failed");
            }
        }

        @Override
        public void initializeState(FunctionInitializationContext functionInitializationContext) throws Exception {

        }
    }
}

本地运行Flink任务发现,在snapshotState方法中抛出异常,不会生成checkpoint目录及metadata file;延长方法的执行时间,在执行checkpoint的时候会先生成空的checkpoint目录。

checkpoint metadata file解析

java 复制代码
public class CheckpointMetaDataAnalyzer {
    public static void main(String[] args) throws Exception {
        File metadataFile = new File("./checkpoint/d3299c5896dee8c5870606e41b0e0c0a/chk-5", "_metadata");
        try (DataInputStream dis = new DataInputStream(Files.newInputStream(metadataFile.toPath()))) {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            CheckpointMetadata metadata = Checkpoints.loadCheckpointMetadata(
                    dis, classLoader, "./checkpoint/d3299c5896dee8c5870606e41b0e0c0a/chk-5");
            System.out.println("Loaded checkpoint ID: " + metadata.getCheckpointId());
        }
    }
}
相关推荐
竹枝溪9 小时前
MySQL进阶:约束、多表设计、多表查询与事务
java·数据库·mysql·事务·子查询·acid·多表查询
上玄code9 小时前
【Agent精讲】调一个LLMAPI背后的工程问题
java·开发语言·python·chatgpt
李冰然9 小时前
深入Java集合框架:ArrayList源码解析(JDK 8)
java
小小啊python9 小时前
IDEA中SpringBoot项目配置热部署
java·ide·intellij-idea·springboot·热部署
Java成神之路-9 小时前
Spring AI Alibaba 实现多轮对话记忆:ChatMemory 与 Redis 持久化实战
java·springaialibaba
JAVA面经实录9179 小时前
网络编程基础(Java Web/分布式前置·完整版)(十一)
java·前端·网络
代码方舟9 小时前
零信任架构实战:基于天远人企关联构建自动化企业尽职调查网关
java·人工智能·架构·自动化
汽车仪器仪表相关领域10 小时前
SIRIUS R1DB/R2DB便携式一体化数据采集系统
大数据·人工智能·功能测试·深度学习·压力测试
Escalating_xu10 小时前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器
城管不管10 小时前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试