flink的CoProcessFunction使用示例

背景

在flink中对两个流进行connect之后进行出处理的场景很常见,我们本文就以书中的一个例子为例说明下实现一个CoProcessFunction的一些要点

实现CoProcessFunction的一些要点

这个例子举例的是当收到某个传感器放行的控制消息时,从传感器传来的温度流消息会被运行向下游传递一段时间

java 复制代码
/**
 * 展示CoProcessFunction+onTimer使用方法的例子
 */
public class CoProcessFunctionTimers {
 
    public static void main(String[] args) throws Exception {
 
        // set up the streaming execution environment
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
 
        // use event time for the application
        env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
 
        // 控制消息流允许传感器消息流通过指定长度的时间
        DataStream<Tuple2<String, Long>> filterSwitches = env
            .fromElements(
                // forward readings of sensor_2 for 10 seconds
                Tuple2.of("sensor_2", 10_000L),
                // forward readings of sensor_7 for 1 minute
                Tuple2.of("sensor_7", 60_000L));
 
        // 传感器消息流
        DataStream<SensorReading> readings = env
            // SensorSource generates random temperature readings
            .addSource(new SensorSource());
 
        //传感器消息流connet控制消息流,并且按照传感器id作为key进行分组
        DataStream<SensorReading> forwardedReadings = readings
            //连接控制消息流
            .connect(filterSwitches)
            // 按照传感器id分组
            .keyBy(r -> r.id, s -> s.f0)
            // 应用CoProcessFunction + onTimer函数
            .process(new ReadingFilter());
 
        forwardedReadings.print();
 
        env.execute("Filter sensor readings");
    }
 
    //应用CoProcessFunction + onTimer函数,这已经按照key=传感器id分好组
    public static class ReadingFilter extends CoProcessFunction<SensorReading, Tuple2<String, Long>, SensorReading> {
 
        // 传感器开关状态--键值分区状态,key是传感器id
        private ValueState<Boolean> forwardingEnabled;
     // 保存传感器开关持续时间的状态--键值分区状态,key是传感器id
        private ValueState<Long> disableTimer;
 
        // 初始化键值分区状态 key是传感器id
        public void open(Configuration parameters) throws Exception {
            forwardingEnabled = getRuntimeContext().getState(
                new ValueStateDescriptor<>("filterSwitch", Types.BOOLEAN));
            disableTimer = getRuntimeContext().getState(
                new ValueStateDescriptor<Long>("timer", Types.LONG));
        }
 
        @Override
        public void processElement1(SensorReading r, Context ctx, Collector<SensorReading> out) throws Exception {
            // 处理传感器消息流,首先检查key是传感器id对应的键值分区状态,如果开启,那么这个传感器消息就可以正常通过
            Boolean forward = forwardingEnabled.value();
            if (forward != null && forward) {
                out.collect(r);
            }
        }
 
        @Override
        public void processElement2(Tuple2<String, Long> s, Context ctx, Collector<SensorReading> out) throws Exception {
            //控制流消息过来后,更新键值分区的开关状态为true, key是传感器id
            forwardingEnabled.update(true);
        //控制流消息过来后,更新键值分区的开关状态为true的持续时长的定时器, key是传感器id
            long timerTimestamp = ctx.timerService().currentProcessingTime() + s.f1;
            Long curTimerTimestamp = disableTimer.value();
            if (curTimerTimestamp == null || timerTimestamp > curTimerTimestamp) {
                // remove current timer
                if (curTimerTimestamp != null) {
                    ctx.timerService().deleteProcessingTimeTimer(curTimerTimestamp);
                }
                // register new timer
                ctx.timerService().registerProcessingTimeTimer(timerTimestamp);
                disableTimer.update(timerTimestamp);
            }
        }
 
        // 键值开关状态的持续时间定时器,key是传感器id,注意,在ontimer方法中,也可以通过out.collect的方式向下游算子发送消息
        public void onTimer(long ts, OnTimerContext ctx, Collector<SensorReading> out) throws Exception {
            // 定时器时间到了之后,清理掉传感器的开关状态
            forwardingEnabled.clear();
            disableTimer.clear();
        }
    }
}

以上就是实现一个CoProcessFunction的大概逻辑

相关推荐
2401_883041081 小时前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
青云交1 小时前
大数据新视界 -- 大数据大厂之 Impala 性能优化:融合机器学习的未来之路(上 (2-1))(11/30)
大数据·计算资源·应用案例·数据交互·impala 性能优化·机器学习融合·行业拓展
Json_181790144804 小时前
An In-depth Look into the 1688 Product Details Data API Interface
大数据·json
Qspace丨轻空间6 小时前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
Elastic 中国社区官方博客7 小时前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
Aloudata8 小时前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
水豚AI课代表8 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
拓端研究室TRL11 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗11 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
编码小袁12 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据