flink处理延迟

flink主要是处理实时数据的,在处理实时数据的过程中,难免会遇到乱序的存在。以事件时间举例,先发生的事件后到处理算子。flink针对乱序数据的处理主要有三种方式:

  • 拨慢水位线的生成,这种情况会在声明的窗口时间中,类似延迟窗口时间的大小,实际是把水位线的生成减小了1秒,导致窗口延迟关闭。下面的例子声明创建了一个滚动事件时间窗口,有效期是5秒,但是在生成水位线的时候,会拨慢1秒,如果是1000毫秒开始,实际计算触发的时间是6000毫秒时触发,窗口有效期是[0,4999)
  1. .assignTimestampsAndWatermarks(WatermarkStrategy.
  2. <Tuple3<String, String, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(1))
  3. .withTimestampAssigner(new SerializableTimestampAssigner<Tuple3<String, String, Long>>() {
  4. @Override
  5. public long extractTimestamp(Tuple3<String, String, Long> element, long recordTimestamp) {
  6. return element.f2;
  7. }
  8. })
  9. ).keyBy(data -> data.f0)
  10. .window(TumblingEventTimeWindows.of(Time.seconds(5)))
  11. Bob,成都,1000
  12. Bob,成都,4000
  13. Bob,成都,5000
  14. Bob,成都,6000
  15. 窗口 0 - 5000 中共有 2 个元素,窗口关闭时,当前水位线4999
  • allowedLateness延长窗口时间

    上面的水位线到达临界点时,触发计算,触发计算的同时,关闭窗口,再迟到的数据就不再处理了。allowedLateness的原理就是延长窗口的关闭时间,水位线到点了,触发计算,但是窗口暂时不会关闭在allowedLateness周期内,再迟到的数据仍然允许再次处理
  1. ds.map(new MapFunction<String, Tuple3<String,String,Long>>() {
  2. @Override
  3. public Tuple3<String, String, Long> map(String value) throws Exception {
  4. String[] split = value.split(",");
  5. System.out.println(value);
  6. return Tuple3.of(split[0],split[1],Long.valueOf(split[2]));
  7. }
  8. }).assignTimestampsAndWatermarks(WatermarkStrategy.
  9. <Tuple3<String, String, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(1))
  10. .withTimestampAssigner(new SerializableTimestampAssigner<Tuple3<String, String, Long>>() {
  11. @Override
  12. public long extractTimestamp(Tuple3<String, String, Long> element, long recordTimestamp) {
  13. return element.f2;
  14. }
  15. })
  16. ).keyBy(data -> data.f0)
  17. .window(TumblingEventTimeWindows.of(Time.seconds(5)))
  18. .allowedLateness(Time.minutes(1))
  19. Bob,成都,1000
  20. Bob,成都,3000
  21. Bob,成都,5000
  22. Bob,成都,6000
  23. 窗口 0 - 5000 中共有 2 个元素,窗口关闭时,当前水位线4999
  24. Bob,成都,16000
  25. 窗口 5000 - 10000 中共有 2 个元素,窗口关闭时,当前水位线14999
  26. Bob,成都,4000
  27. 窗口 0 - 5000 中共有 3 个元素,窗口关闭时,当前水位线14999
  • sideOutputLateData侧输出流

    上面的两种方式,都是通过延迟水位线或者延长窗口的方式来处理的,实际处理过程中都会占据资源,不可能一直延迟水位线或者让窗口一直存在,在允许范围内的数据处理完毕之后,还得有一种兜底方案,处理极限情况,那就是直接把迟到的数据输出到侧输出流。
  1. OutputTag<Tuple3<String, String, Long>> lateTag = new OutputTag<Tuple3<String, String, Long>>("late"){};
  2. env.setParallelism(1);
  3. SingleOutputStreamOperator<String> process = ds.map(new MapFunction<String, Tuple3<String, String, Long>>() {
  4. @Override
  5. public Tuple3<String, String, Long> map(String value) throws Exception {
  6. String[] split = value.split(",");
  7. System.out.println(value);
  8. return Tuple3.of(split[0], split[1], Long.valueOf(split[2]));
  9. }
  10. }).assignTimestampsAndWatermarks(WatermarkStrategy.
  11. <Tuple3<String, String, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(1))
  12. .withTimestampAssigner(new SerializableTimestampAssigner<Tuple3<String, String, Long>>() {
  13. @Override
  14. public long extractTimestamp(Tuple3<String, String, Long> element, long recordTimestamp) {
  15. return element.f2;
  16. }
  17. })
  18. ).keyBy(data -> data.f0)
  19. .window(TumblingEventTimeWindows.of(Time.seconds(5)))
  20. .allowedLateness(Time.minutes(1))
  21. .sideOutputLateData(lateTag)

完整的测试代码如下

  1. public class SideOutPutLateTest {
  2. public static void main(String[] args) throws Exception {
  3. StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  4. DataStreamSource<String> ds = env.socketTextStream("hadoop103", 9999);
  5. OutputTag<Tuple3<String, String, Long>> lateTag = new OutputTag<Tuple3<String, String, Long>>("late"){};
  6. env.setParallelism(1);
  7. SingleOutputStreamOperator<String> process = ds.map(new MapFunction<String, Tuple3<String, String, Long>>() {
  8. @Override
  9. public Tuple3<String, String, Long> map(String value) throws Exception {
  10. String[] split = value.split(",");
  11. System.out.println(value);
  12. return Tuple3.of(split[0], split[1], Long.valueOf(split[2]));
  13. }
  14. }).assignTimestampsAndWatermarks(WatermarkStrategy.
  15. <Tuple3<String, String, Long>>forBoundedOutOfOrderness(Duration.ofSeconds(1))
  16. .withTimestampAssigner(new SerializableTimestampAssigner<Tuple3<String, String, Long>>() {
  17. @Override
  18. public long extractTimestamp(Tuple3<String, String, Long> element, long recordTimestamp) {
  19. return element.f2;
  20. }
  21. })
  22. ).keyBy(data -> data.f0)
  23. .window(TumblingEventTimeWindows.of(Time.seconds(5)))
  24. .allowedLateness(Time.minutes(1))
  25. .sideOutputLateData(lateTag)
  26. .process(new ProcessWindowFunction<Tuple3<String, String, Long>, String, String, TimeWindow>() {
  27. @Override
  28. public void process(String s, ProcessWindowFunction<Tuple3<String, String, Long>, String, String, TimeWindow>.Context context, Iterable<Tuple3<String, String, Long>> iterable, Collector<String> collector) throws Exception {
  29. long start = context.window().getStart();
  30. long end = context.window().getEnd();
  31. long watermark = context.currentWatermark();
  32. long count = iterable.spliterator().getExactSizeIfKnown();
  33. collector.collect(" 窗口 " + start + " - " + end + " 中共有 " + count + " 个元素,窗口关闭时,当前水位线" +
  34. +watermark);
  35. }
  36. });
  37. // ds.print();
  38. process.print();
  39. process.getSideOutput(lateTag).print("迟到数据");
  40. env.execute();
  41. }
  42. }

flink处理延迟的更多相关文章

  1. 深入理解Flink核心技术(转载)

    作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ...

  2. Storm VS Flink ——性能对比

    1.背景 Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架.其中 Apache Storm(以下简称"Storm")在美团点评实时 ...

  3. 深入了解 Flink 网络栈(二):监控、指标和处理背压

    在之前的文章中,我们从高级抽象到底层细节各个层面全面介绍了 Flink 网络栈的工作机制.作为这一系列的第二篇文章,本文将在第一篇的基础上更进一步,主要探讨如何监视与网络相关的指标,从而识别背压等因素 ...

  4. [白话解析] Flink的Watermark机制

    [白话解析] Flink的Watermark机制 0x00 摘要 对于Flink来说,Watermark是个很难绕过去的概念.本文将从整体的思路上来说,运用感性直觉的思考来帮大家梳理Watermark ...

  5. [Flink] Flink的waterMark的通俗理解

    导读 Flink 为实时计算提供了三种时间,即事件时间(event time).摄入时间(ingestion time)和处理时间(processing time). 遇到的问题: 假设在一个5秒的T ...

  6. flink进阶篇

    Flink 面试--进阶篇 1.Flink是如何支持批流一体的? 2.Flink是如何做到高效的数据交换的? 3.Flink是如何做容错的? 4.Flink 分布式快照的原理是什么? 5.Flink ...

  7. 《基于Apache Flink的流处理》读书笔记

    前段时间详细地阅读了 <Apache Flink的流处理> 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细.全面得介 ...

  8. Flink 中LatencyMarks延迟监控(源码分析)

    流式计算中处理延迟是一个非常重要的监控metric flink中通过开启配置   metrics.latency.interval  来开启latency后就可以在metric中看到askManage ...

  9. 使用Apache Flink 和 Apache Hudi 创建低延迟数据湖管道

    近年来出现了从单体架构向微服务架构的转变.微服务架构使应用程序更容易扩展和更快地开发,支持创新并加快新功能上线时间.但是这种方法会导致数据存在于不同的孤岛中,这使得执行分析变得困难.为了获得更深入和更 ...

随机推荐

  1. 带码农《手写Mybatis》进度3:实现映射器的注册和使用

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  2. 基于Composer的Laravel扩展包开发工作流 ,实现laravle项目的文件管理(记录成长)

    PHP Composer包开发 基于Composer的Laravel扩展包开发工作流 实现laravle项目的文件管理,添加文件/文件夹,删除文件,查看代码/文件(代码支持缩进,支持语法高亮) com ...

  3. vue - 文字3d展示

    <template>   <div>     <p>     <span>C</span>     <span>S</sp ...

  4. C#+Access 员工信息管理--简单的增删改查操作和.ini配置文件的读写操作。

    1.本程序的使用的语言是C#,数据库是Access2003.主要是对员工信息进行简单的增删改查操作和对.ini配置文件的读写操作. 2.代码运行效果如下: 功能比较简单.其中在得到查询结果后,在查询结 ...

  5. mosquitto服务器的安装以及mqtt.fx软件的使用

    一.MQTT描述 MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议,由 IB ...

  6. Photoshop图片处理在线网页使用无需下载绿色

    今天给大家推荐一个ps在线版网页 实测使用效果不错,绿色简介,无需下载,不卡顿一般的电脑配置都可以带起来 因为是在线的所以是精简版的,但是一般ps软件有的工具,功能他都有,比较适合及时性使用 废话不多 ...

  7. 微博python爬虫weiboSpider注意事项

    首先我看的weiboSpider爬虫项目教程出自https://github.com/dataabc/weiboSpider 1.这爬取的是手机端的,所以我把网址https://weibo.com的. ...

  8. k8s入门之Ingress(七)

    Ingress 的功能其实很容易理解:所谓 Ingress,就是 Service 的"Service",代理不同后端 Service 而设置的负载均衡服务. 一.安装ingress ...

  9. python学习-Day22

    目录 今日内容详细 hashlib加密模块 什么是加密 加密算法 加密的使用 基本使用 指定算法(md5) 将明文数据传递给算法对象 获取加密之后的密文数据 加密补充 加盐处理 动态加盐 加密应用场景 ...

  10. stm32F103C8T6通过写寄存器点亮LED灯

    因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正 我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器 ...