FLink迟到数据的处理之三
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迟到数据的处理之三的更多相关文章
- 【源码解析】Flink 是如何处理迟到数据
相信会看到这篇文章的都对Flink的时间类型(事件时间.处理时间.摄入时间)和Watermark有些了解,当然不了解可以先看下官网的介绍:https://ci.apache.org/projects/ ...
- flink-----实时项目---day06-------1. 获取窗口迟到的数据 2.双流join(inner join和left join(有点小问题)) 3 订单Join案例(订单数据接入到kafka,订单数据的join实现,订单数据和迟到数据join的实现)
1. 获取窗口迟到的数据 主要流程就是给迟到的数据打上标签,然后使用相应窗口流的实例调用sideOutputLateData(lateDataTag),从而获得窗口迟到的数据,进而进行相关的计算,具体 ...
- 《从0到1学习Flink》—— Flink 写入数据到 Kafka
前言 之前文章 <从0到1学习Flink>-- Flink 写入数据到 ElasticSearch 写了如何将 Kafka 中的数据存储到 ElasticSearch 中,里面其实就已经用 ...
- 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
前言 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector. 1.<从0到1学习Flink>-- Data Source 介绍 2.<从0到1 ...
- 企业实践 | 如何更好地使用 Apache Flink 解决数据计算问题?
业务数据的指数级扩张,数据处理的速度可不能跟不上业务发展的步伐.基于 Flink 的数据平台构建.运用 Flink 解决业务场景中的具体问题等随着 Flink 被更广泛的应用于广告.金融风控.实时 B ...
- 如何用Flink把数据sink到kafka多个(成百上千)topic中
需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...
- flink系列-10、flink保证数据的一致性
本文摘自书籍<Flink基础教程> 一.一致性的三种级别 当在分布式系统中引入状态时,自然也引入了一致性问题.一致性实际上是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结果 ...
- 如何用Flink把数据sink到kafka多个不同(成百上千)topic中
需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...
- [原创.数据可视化系列之三]使用Ol3加载大量点数据
不管是百度地图还是高德地图,都很难得见到在地图上加载大量点要素,比如同屏1000的,因为这样客户端性能会很低,尤其是IE系列的浏览器,简直是卡的要死.但有的时候,还真的需要,比如,我要加载全球的AQI ...
随机推荐
- CSS基础 列表相关的属性的使用
1.无序列表:就是不需要排列顺序的情况,用无序列表 语法结构:<ul> <li></li> <li></li> </ul> 特点 ...
- 《手把手教你》系列技巧篇(五十五)-java+ selenium自动化测试-上传文件-下篇(详细教程)
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.为什么selenium没有提供 ...
- 初识python: flush 实现进度条打印
通过flush(强制刷新)实现,类似进度条打印: #!/user/bin env python # author:Simple-Sir # time:20180918 #打印进度条 import sy ...
- Flask_Jinja2模板(九)
在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求.实际上,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本. ...
- Spark-local本地环境搭建
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815385772254822919/ 承接上一个文档<Spark源码编译> 解压spark编译好的压缩 ...
- Word文档学习小练习链接
1. < Word2010初学> https://www.toutiao.com/i6487370439910752782/ 2. <Word2010格式化可爱的家乡> htt ...
- 关于Vue中根组件与组件树的理解
在观看了b站的关于Vue3的教学视频后,对Vue的根组件与组件树进行简单的总结下 一.实例化Vue应用 // 此时,app就是一个Vue应用的实例,或者说是一个对象 const app = Vue.c ...
- docker的安装以及使用命令
docker的安装 安装docker https://docs.docker.com/install/linux/docker-ce/centos/#set-up-the-repository 从 2 ...
- pycharm常用设置项和快捷键
python开发工具pycharm非常人性化,使用方便,功能强大,可以做到与项目配置库结合使用.初次使用,一些设置项和快捷键不那么容易被发现和设置,那么给大家下面总结pycharm常用的设置项和快捷键 ...
- 使用Redis分布式锁控制请求串行处理
1.需求背景 在一些写接口的场景下,由于一些网络因素导致用户的表单重复提交,就会在相邻很短的时间内,发出多个数据一样的请求.后台接口的幂等性保证一般都是先检查数据的状态,然后决定是否进行执行写入操作, ...