Flink之KeyedState

前面的文章中介绍过Operator State,这里介绍一下Keyed State.

在使用Operator State时必须要实现CheckpointFunction接口,而Keyed State则不需要,在使用keyBy(...)分组分组后,调用的函数必须是实现RichFuntion接口的函数才可以使用Keyed State.同样使用Keyed State也必须开启Checkpoint.

  • 需求
    将接收到的Socket数据源中的字符串进行拼接
    在命令行开启socket命令:

    shell 复制代码
    nc -lk 8888
  • 业务代码

    java 复制代码
    public class FlinkKeyedState {
      public static void main(String[] args) throws Exception {
          StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
          // 设置并行度为1,便于观察
          env.setParallelism(1);
          // 开启Checkpoint, 8秒一个周期并开启一次性语义
          env.enableCheckpointing(8000, CheckpointingMode.EXACTLY_ONCE);
          // 指定checkpoint持久化路径
          env.getCheckpointConfig().setCheckpointStorage("file:///Users/xxx/data/testData/checkpoint");
          // 开启Task级别故障自动failover,通过fixedDelayRestart设置Task重启上限和重启间隔,这里设置的重启次数为2次,一旦Task重启次数超过这个次数,整个job也会停止
          env.setRestartStrategy(RestartStrategies.fixedDelayRestart(2, Time.seconds(5)));
          // 获取Socket数据源
          DataStreamSource<String> socketSource = env.socketTextStream("localhost", 8888);
          // 将数据进行分组,将分组key给一个常量值
          SingleOutputStreamOperator<String> map = socketSource.keyBy(s -> "1")
                  // 使用Keyed State的算子必须实现RichFunction接口,如RichMapFunction,ProcessFunction等
                  .map(new RichMapFunction<String, String>() {
                      ListState<String> listState;
    
                      // open方法可以理解为和Operator State中的initializeState方法一样,需要在这个方法中构造和获取状态存储器
                      @Override
                      public void open(Configuration parameters) throws Exception {
                          // 获取上下文
                          RuntimeContext ctx = getRuntimeContext();
                          // 获取ListState,不同于Operator State的是在这里有更多的选择,如ListState,MapState等
                          listState = ctx.getListState(new ListStateDescriptor<>("demo", String.class));
                      }
    
                      // 在map方法中正常编写业务逻辑
                      @Override
                      public String map(String s) throws Exception {
                          // 模拟Task失败
                          if (s.equals("k") && RandomUtils.nextInt(0, 5) == 3) {
                              throw new Exception("Task 异常");
                          }
                          // 将数据添加到状态存储器中
                          listState.add(s);
    
                          Iterable<String> strings = listState.get();
                          StringBuilder builder = new StringBuilder();
                          for (String string : strings) {
                              builder.append(string);
                          }
                          return builder.toString();
                      }
                  });
          map.print();
          env.execute("Keyed State");
      }
    }

    API的使用大概就这些内容,不过在使用Keyed Sate时首先要对keyBy的特性有所了解,才能得到最终想要的结果数据,如使用keyBy时上下游之间的数据分发模式、所设置的默认并行度上下游算子的并行度是否一致等问题,这些都是需要注意的,然后根据实际业务需求开发对应的逻辑就可以了.

相关推荐
咩咩啃树皮3 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚3 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白5 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司5 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地6 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun3141596 小时前
TCP超时重传机制是为了解决什么问题?
java
延凡科技7 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
ifenxi爱分析8 小时前
爱分析最新报告解读:AI数据基础设施与数据中台的区别
大数据·人工智能
莫逸风9 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
品牌全球行9 小时前
共商共建共享 链接数字未来——“一带一路数字新城(深圳)会客厅筹备办”揭牌仪式在深圳隆重举行
大数据·人工智能