Flink迟到的数据更新窗口计算结果,窗口销毁后的迟到数据输出到测输出流

主程序:

//TODO 使用迟到的数据更新窗口的计算结果
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "hadoop106:9092");
SingleOutputStreamOperator<String> result = env.addSource(new FlinkKafkaConsumer<String>
("Tuple2", new SimpleStringSchema(), properties))
.map(new MapFunction<String, Tuple2<String, Long>>() {
@Override
public Tuple2<String, Long> map(String value) throws Exception {
return Tuple2.of(value.split(" ")[0], Long.parseLong(value.split(" ")[1]) * 1000L);
}
}).assignTimestampsAndWatermarks(WatermarkStrategy.<Tuple2<String, Long>>forMonotonousTimestamps()
.withTimestampAssigner(new SerializableTimestampAssigner<Tuple2<String, Long>>() {
@Override
public long extractTimestamp(Tuple2<String, Long> element, long recordTimestamp) {
return element.f1;
}
})).keyBy(r -> r.f0)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.allowedLateness(Time.seconds(5))//允许迟到时间为5秒 窗口闭合触发计算 但是窗口不销毁 5秒内 迟到的数据如果
// 到来的话 更新窗口的计算结果 允许迟到时间和最大延迟时间的区别是 设置允许迟到时间可以提前看到窗口的聚合结果 虽然不准确
// 但是后面迟到的数据到来的话会更新窗口的计算结果 如果时间超过了允许迟到时间 那么可以将迟到的数据发送到侧输出流中
.sideOutputLateData(new OutputTag<Tuple2<String, Long>>("lateStream") {
})
.process(new ProcessWindowFunction<Tuple2<String, Long>, String, String, TimeWindow>() {
@Override
public void process(String s, Context context, Iterable<Tuple2<String, Long>> elements, Collector<String> out) throws Exception {
// out.collect("key为:"+s+"窗口的时间范围是:"+new Timestamp(context.window().getStart())+
// "-"+new Timestamp(context.window().getEnd())+"元素的个数是:"+elements.spliterator().
// getExactSizeIfKnown());
// 窗口闭合的时候,触发窗口的第一次计算
ValueState<Boolean> firstCalculate = context.windowState().getState(new
ValueStateDescriptor<Boolean>("firstCalculate", Types
.BOOLEAN));
if (firstCalculate.value() == null) {
out.collect("窗口第一次触发计算,窗口中的元素个数是:" + elements.spliterator().
getExactSizeIfKnown() + "窗口的时间范围是:" + new Timestamp(context.window().getStart()) + "-" +
new Timestamp(context.window().getEnd()));
firstCalculate.update(true);
} else {
out.collect("迟到的元素触发计算了,更新后的元素的个数是:" + elements.spliterator()
.getExactSizeIfKnown());
}
}
});
result.printToErr("主流输出");
result.getSideOutput(new OutputTag<Tuple2<String, Long>>("lateStream") {
}).print("测输出流");
env.execute();
}

程序分析:

通过kafka生产者往Tuple2 topic中生产数据,当输入a 1的时候,此时开启一个0-5s钟的窗口,当输入a 5的时候,0-5s的窗口第一次触发计算,此时窗口闭合,触发窗口函数process的执行,由于是窗口

的第一次计算,将状态变量置为true,后续迟到的数据在允许等待迟到时间内到达将触发窗口的第2/3/4次计算等等,更新计算结果,当输入a 10的时候,此时的水位线为9999,到达了0-5s的窗口销毁的时间,

0-5s的窗口在窗口结束时间+允许等待迟到时间也就是10s的时候销毁。后续如果0-5s窗口的数据到来,通过sideOutPutLateData窗口函数将会被发送到侧输出流。

FLink迟到数据的处理之三的更多相关文章

  1. 【源码解析】Flink 是如何处理迟到数据

    相信会看到这篇文章的都对Flink的时间类型(事件时间.处理时间.摄入时间)和Watermark有些了解,当然不了解可以先看下官网的介绍:https://ci.apache.org/projects/ ...

  2. flink-----实时项目---day06-------1. 获取窗口迟到的数据 2.双流join(inner join和left join(有点小问题)) 3 订单Join案例(订单数据接入到kafka,订单数据的join实现,订单数据和迟到数据join的实现)

    1. 获取窗口迟到的数据 主要流程就是给迟到的数据打上标签,然后使用相应窗口流的实例调用sideOutputLateData(lateDataTag),从而获得窗口迟到的数据,进而进行相关的计算,具体 ...

  3. 《从0到1学习Flink》—— Flink 写入数据到 Kafka

    前言 之前文章 <从0到1学习Flink>-- Flink 写入数据到 ElasticSearch 写了如何将 Kafka 中的数据存储到 ElasticSearch 中,里面其实就已经用 ...

  4. 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch

    前言 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector. 1.<从0到1学习Flink>-- Data Source 介绍 2.<从0到1 ...

  5. 企业实践 | 如何更好地使用 Apache Flink 解决数据计算问题?

    业务数据的指数级扩张,数据处理的速度可不能跟不上业务发展的步伐.基于 Flink 的数据平台构建.运用 Flink 解决业务场景中的具体问题等随着 Flink 被更广泛的应用于广告.金融风控.实时 B ...

  6. 如何用Flink把数据sink到kafka多个(成百上千)topic中

    需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...

  7. flink系列-10、flink保证数据的一致性

    本文摘自书籍<Flink基础教程> 一.一致性的三种级别 当在分布式系统中引入状态时,自然也引入了一致性问题.一致性实际上是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结果 ...

  8. 如何用Flink把数据sink到kafka多个不同(成百上千)topic中

    需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...

  9. [原创.数据可视化系列之三]使用Ol3加载大量点数据

    不管是百度地图还是高德地图,都很难得见到在地图上加载大量点要素,比如同屏1000的,因为这样客户端性能会很低,尤其是IE系列的浏览器,简直是卡的要死.但有的时候,还真的需要,比如,我要加载全球的AQI ...

随机推荐

  1. 论文翻译:2021_Semi-Blind Source Separation for Nonlinear Acoustic Echo Cancellation

    论文地址:https://ieeexplore.ieee.org/abstract/document/9357975/ 基于半盲源分离的非线性回声消除 摘要: 当使用非线性自适应滤波器时,数值模型与实 ...

  2. linux(CentOS7) 之 MySQL 5.7.30 下载及安装

    一.下载 1.百度搜索mysql,进入官网(或直接进入官网https://www.mysql.com) 2.选择 downloads 3.翻到最下面,选择MySQL Community (GPL) D ...

  3. Django_模型类详解(七)

    # 定义书籍模型类 class BookInfo(models.Model): btitle = models.CharField(max_length=20) # 书籍名称 bpub_date = ...

  4. notepad++加到右键

    win10系统左下角点击"开始"->运行->regedit,打开注册表编辑器 在HKEY_CLAsssEs_RooT→ * → shell 下,在shell下,新建项命 ...

  5. spring boot pom.xml 提示 ignored 具体解决

    1.出现这个情况 2. 进入设置,找到 去掉勾选即可

  6. @RestController和@Controller的关系

    @RestController注解,相当于@Controller+@ResponseBody两个注解的结合

  7. 第10组 Alpha冲刺 (3/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13971668.html ·作业博客:https://edu.cnblogs.co ...

  8. Elasticsearch安装与配置

    一.下载(华为云) https://mirrors.huaweicloud.com/elasticsearch/https://mirrors.huaweicloud.com/kibana/7.6.2 ...

  9. Calendar日期往后一天,一月等

    import java.util.Date ;       Date date=new   Date();//取时间 System.out.println(date.toString());     ...

  10. css处理工具PostCss

    在 Web 应用开发中,CSS 代码的编写是重要的一部分.CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中.这给开发人员带来了效率上 ...