Flink算子通用状态应用测试样例

Flink算子通用状态应用测试样例

1. 获取Flink执行环境
c 复制代码
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
    

2. 创建数据源,生成随机数据
c 复制代码
        DataStream<Map<String, String>> source = env.addSource(new SourceFunction<Map<String, String>>() {
            @Override
            public void run(SourceContext<Map<String, String>> ctx) throws Exception {
                while (true) {
                    HashMap<String, String> hashMap = new HashMap<>();
                    hashMap.put("ID", new Random().nextInt(3) + 1 + "");
                    hashMap.put("AMT", "1");
                    System.out.println("------");
                    System.out.println("生产数据:" + hashMap);
                    ctx.collect(hashMap);
                    Thread.sleep(1000);
                }
            }
            @Override
            public void cancel() {}
        });

3. 按照ID和星期几进行分组
c 复制代码
        KeyedStream<Map<String, String>, String> keyedStream = source.keyBy(new KeySelector<Map<String, String>, String>() {
            @Override
            public String getKey(Map<String, String> value) throws Exception {
                return value.get("ID") + LocalDate.now().getDayOfWeek();
            }
        });

4. 处理函数,实现状态初始化和元素处理逻辑
c 复制代码
        SingleOutputStreamOperator<Map<String, String>> process = keyedStream.process(new KeyedProcessFunction<String, Map<String, String>, Map<String, String>>() {
            private AggregatingState<Map<String, String>, Map<String, String>> aggState;

            @Override
            public void open(Configuration parameters) throws Exception {
                // 配置状态的TTL
                StateTtlConfig ttlConfig = StateTtlConfig
                        .newBuilder(Time.days(1))
                        .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite) // 仅在创建和写入时清除,另一个读和写时清除
                        .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired) // 不退回过期值
                        .build();
                // 初始化状态
                AggregatingStateDescriptor<Map<String, String>, Map<String, String>, Map<String, String>> aggRes = new AggregatingStateDescriptor<>("aggRes", new AggregateFunction<Map<String, String>, Map<String, String>, Map<String, String>>() {
                    @Override
                    public Map<String, String> createAccumulator() {
                        return new HashMap<>();
                    }

                    @Override
                    public Map<String, String> add(Map<String, String> in, Map<String, String> acc) {
                        String amt = acc.get("AMT");
                        if (amt == null) {
                            acc.put("ID", in.get("ID"));
                            acc.put("AMT", in.get("AMT"));
                        } else {
                            acc.put("AMT", Integer.valueOf(in.get("AMT")) + Integer.valueOf(amt) + "");
                        }
                        return acc;
                    }

                    @Override
                    public Map<String, String> getResult(Map<String, String> acc) {
                        return acc;
                    }

                    @Override
                    public Map<String, String> merge(Map<String, String> a, Map<String, String> b) {
                        return null;
                    }
                }, TypeInformation.of(new TypeHint<Map<String, String>>() {
                }));
                aggRes.enableTimeToLive(ttlConfig);
                aggState = getRuntimeContext().getAggregatingState(aggRes);
            }

            @Override
            public void processElement(Map<String, String> value, KeyedProcessFunction<String, Map<String, String>, Map<String, String>>.Context ctx, Collector<Map<String, String>> out) throws Exception {
                aggState.add(value);
                out.collect(aggState.get());
            }
        });

5. 打印聚合结果
c 复制代码
        process.map((MapFunction<Map<String, String>, Object>) value -> {
            System.out.println("聚合结果:" + value);
            return null;
        });

6. 执行作业
c 复制代码
        env.execute("Flink Common State Test");

7. 执行结果
c 复制代码
------
生产数据:{AMT=1, ID=2}
聚合结果:{AMT=1, ID=2}
------
生产数据:{AMT=1, ID=3}
聚合结果:{AMT=1, ID=3}
------
生产数据:{AMT=1, ID=3}
聚合结果:{AMT=2, ID=3}
------
生产数据:{AMT=1, ID=1}
聚合结果:{AMT=1, ID=1}
------
生产数据:{AMT=1, ID=1}
聚合结果:{AMT=2, ID=1}
------
生产数据:{AMT=1, ID=1}
聚合结果:{AMT=3, ID=1}
...

这段代码实现了一个 Flink 作业,生成随机数据并对数据进行状态聚合处理。其中包括数据源生成、按键分区、状态初始化、元素聚合处理和结果输出。可以作为多场景下通用的实时数据处理模型。

相关推荐
小刘在重生~1 小时前
Servlet_day2 (上)|Servlet 整合 JDBC|请求转发 forward|Request 作用域
hive·hadoop·servlet
wangchunyu1143 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck4 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir4 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人4 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521595 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐6 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp
古法老登瞎折腾6 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
ai大模型-探索者6 小时前
Function Call与MCP(区别、联系与实战)
java·服务器·网络
略略略咯咯6 小时前
啊啊啊啊啊
java·服务器·数据库