Flink简单教学5-时间

2023-10-27

时间(Time)

Flink支持三种不同的时间:

  • 处理时间(processing time):指当前操作的时间(如:map())。当程序以处理时间运行,所有基于时间的操作(窗口),都依赖各个operator的机器时间。
  • 事件时间(event time):事件时间可以理解称为数据产生的时间,是和数据绑定的。使用事件时间时必须设置其水印,在一定范围内可以处理乱序数据。
  • 接收时间(ingestion time):指事件进入Flink程序的时间,在source operator时生成。和事件时间不同,接收时间不能处理任何无序的数据,同时也不需要指定水印。
    time

设置时间属性

程序的第一部分通常就是设置时间类型(上述三种)

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
// env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime);
// env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

DataStream<MyEvent> stream = env.addSource(new FlinkKafkaConsumer09<MyEvent>(topic, schema, props));

stream
    .keyBy( (event) -> event.getUser() )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) -> a.add(b) )
    .addSink(...);

事件时间和水印(Event Time and Watermarks)

在基于事件时间的流处理中,需要一种方法来度量时间进度,比如每小时触发一次的窗口操作。显然不能直接使用事件时间(事件时间不能保证绝对有序增长),而需要使用水印来衡量时间进度。

水印流作为数据流的一部分,一个时间戳 t。这个Watermark(t)表示事件到达了时间点(t)(一般是当前到达的事件的最大事件时间-容忍的迟到或乱序的最长时间),也就是说不应该 t ’ < = t(即事件与时间戳小于或等于水印)的事件进入当前操作符。

下图是一个事件按顺序(时间顺序)排列,水印在流中只是当做周期(窗口)的标记。
in order

对于无序的的数据流,水印至关重要。不管事件是否按照时间戳排序,水印都会标记在某个时间点之后,所有这个时间戳之前的数据都应该到达了。水印可以让无序的数据在每个窗口之间保持有序。
out of order

上图中W(11),和w(17)之间理解成一个窗口。数据小于W(11)时间戳的被认为是无效数据,而大于W(17)会被缓存起来不会参与窗口的计算以及向下游发送。

在并行流中的水印(Watermarks in Parallel Streams)

水印一般在source function 或者之后生成,并且每个source function的并行任务独立生成各自的水印。
水印产生,并会向下游发送,更新下游的事件时间。同时也是下游生成新水印的依据。一下有多个输入流的操作union,或者keyBy之后,或者partition之后。此类操作符使用的水印生成的事件时间是所有流入水印里面最小的一个。

parallel

生成时间戳和分配水印(Generating Timestamps / Watermarks)

如果Flink使用事件时间处理,那么就需要为每个元素都分配或者指定时间戳。一般都是通过事件的某个字段来提取。

有两种方法来分配时间戳和生成水印:

  1. 直接在source数据流中
  2. 在Flink中使用时间戳分配程序/水印生成器:时间戳分配程序和定水印生成器

以下例子流使用时间戳和水印生成器生成水印和一个新的带时间戳属性的元素:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

DataStream<MyEvent> stream = env.readFile(
        myFormat, myFilePath, FileProcessingMode.PROCESS_CONTINUOUSLY, 100,
        FilePathFilter.createDefaultFilter(), typeInfo);

DataStream<MyEvent> withTimestampsAndWatermarks = stream
        .filter( event -> event.severity() == WARNING )
        .assignTimestampsAndWatermarks(new MyTimestampsAndWatermarks());

withTimestampsAndWatermarks
        .keyBy( (event) -> event.getGroup() )
        .timeWindow(Time.seconds(10))
        .reduce( (a, b) -> a.add(b) )
        .addSink(...);

水印和时间戳生成器:getCurrentWatermark()方法被调用返回一个水印,如果水印非空并且大于前一个水印,则新的水印会被发送。

 public class MyTimestampsAndWatermarks implements AssignerWithPeriodicWatermarks<MyEvent> {

        private Watermark current;

        long currentMaxTimestamp = 0L;
        long maxOutOfOrderless = 5000L; //5秒延时
        @Nullable
        @Override
        public Watermark getCurrentWatermark() {
            current = new Watermark(currentMaxTimestamp - maxOutOfOrderless);
            return current;
        }

        @Override
        public long extractTimestamp(MyEvent element, long previousElementTimestamp) {
            long timeStamp = element.eventTime.getTime();
            currentMaxTimestamp = Math.max(timeStamp, currentMaxTimestamp);
            return timeStamp;
        }
    }

Notice: 窗口最终由事件触发。如30秒的窗口,若事件在前29秒全部发送完毕,并且sourceFunction不会再产生数据会导致窗口无法触发。

更多有关水印的使用请浏览官网Generating Timestamps / Watermarks

本教程的所有示例代码都已上传至Github仓库flink-toturial

下一篇Flink简单教学6-operator

关注我的公众号

了解我的最新动向
qrcode_for_gh_eac3d4651e58_344

收藏我的个人博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flink简单教学5-时间 的相关文章

  • Heyperledger Fabric 运行时架构

    一 运行时架构图 逻辑架构图说明了Heyperledger Fabric 的各个核心组件 模块 由于Heyperledger Fabric 是一个需要保证交易数据安全的分布式系统 所以再实际运行时将不同的服务器配置成为不同的Node 节点

随机推荐

  • allegro中网表的导入与器件放置

    文章目录 封装库路径的指定 网表导入 器件放置 自动器件放置 手动器件放置 room器件放置 封装库路径的指定 Setup User Perference Paths Library中zhi dzhid 特别关注一下三个路径 devpath
  • 小程序开发——比较好看的登录界面设计

    主要代码 login wxml
  • Windows10开机自动运行批处理、脚本等的方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 方法 步骤 一 打开我的电脑 在地址栏输入 C ProgramData Microsoft Windows Start Menu Programs Startup 二 把自
  • 彻底解决乱码问题(附一):简体中文编码中区位码、国标码、内码、外码、字形码的区别及关系

    首先声明这篇博客的创作过程 大部分文本来自 笨笨阿林 的原创文章 我在看完后加入了部分自己的理解 有些地方做了略微调整 比如将有些不易理解的地方重新解释 多余的话删除等 也在最后加入了一个例子来证实了一下在GB2312编码下从区位码到实际在
  • vue3-print-nb 实现页面打印(含分页打印)

    安装vue3 print nb npm install vue3 print nb save 引用vue3 print nb 全局引入 全局引用 import createApp from vue import App from App v
  • 左程云算法笔记(三)堆排序、桶排序、排序总结

    左程云算法笔记 三 堆 堆结构 堆排序 堆排序扩展题 桶排序 计数排序 基数排序 补 桶排序 补 希尔排序 排序总结 稳定性 综合比较 常见的坑 工程上对排序的改进 堆 堆结构 1 堆结构就是用数组实现的完全二叉树结构 2 完全二叉树中如果
  • Spring Boot使用(基础)

    目录 1 Spring Boot是什么 2 Spring Boot使用 2 1Spring目录介绍 2 2SpringBoot的使用 1 Spring Boot是什么 Spring Boot就是Spring脚手架 就是为了简化Spring开
  • 权重设计介绍

    相关产品 RocketMQ 之前在阿里的 负载均衡 比赛中 就有这个算法 RocketMQ 中包含多种负载算法 其中 权重 算法就属于其中一种 也是最实用的一种 奖励系统 经常会有许多活动 或则任务 当用户完成后 可以获得相关的奖励 当然可
  • 华为OD机试 - 评论转换输出(Java)

    题目描述 在一个博客网站上 每篇博客都有评论 每一条评论都是一个非空英文字母字符串 评论具有树状结构 除了根评论外 每个评论都有一个父评论 当评论保存时 使用以下格式 首先是评论的内容 然后是回复当前评论的数量 最后是当前评论的所有了评论
  • 操作系统内核

    现代操作系统一般将OS划分为若干个层次 再将OS的不同功能分别设置在不同的层次中 通常将一些与硬件紧密相关的模块 如中断处理程序等 各种常用及运行频率较高的模块 如时钟管理 进程调度和许多模块所公用的二些基本操作 都安排在紧靠硬件的软件层次
  • vue生命周期

    随着对 vue 的不断了解 会越来越发现它生命周期的重要性 只有了解了它的生命周期 才能在开发项目的时候在逻辑上的很好的判断什么时候该发生什么事件 即很好的控制页面 一 什么是 vue 生命周期 Vue 实例从创建到销毁的过程 就是生命周期
  • kong+Verdaccio+ldap(docker)

    需求 使用Kong来代理Verdaccio 实现直接通过域名 path的方式来访问 并且Verdaccio使用ldap来管理 前提 Kong ldap已部署好 并且也部署好了Kong Dashboard 后面有需求再写关于Kong代理的各种
  • 国内的Ubuntu镜像源

    国内的Ubuntu镜像源 Ubuntu清华镜像源 今天学习docker需要在线Ubuntu镜像 所以做了一个镜像下载地址笔记 方面以后的下载 官方镜像下载访问地址 https cn ubuntu com download alternati
  • 明哥复习MyBatis(1)

    这不是原创 借鉴尚硅谷的 不是原创 一 核心配置文件详解
  • impdp或expdp报错ORA-39002: invalid operation,ORA-39070: Unable to open the log file

    oracle oracle rac01 backup cat expdp par USERID as sysdba DIRECTORY KMDATA EXP job name jinky exp filesize 5000m paralle
  • Java集合——Iterable和Iterator接口介绍

    Iterable Iterable和Iterator是什么 Iterable源码 Iterator源码 使用 Iterable和Iterator是什么 Iterable是Collection的实现接口 即是集合的最顶级父类 Iterator
  • 小白学股票基金_2

    到底是买股票还是买基金 说基金和股票差不多指的应该是偏股型基金 但是基金里面还有债券型 QDII以及非常大众化的货币型基金 众所周知的余额宝就是一款货币型基金啦 等等 风险等级也不一样 所以 为防止这样混为一谈 我们这里讨论的就是炒股和买偏
  • 0.0 Windows + Linux(Ubuntu20.04) 超简单的双系统安装

    目录 一 U盘启动盘的制作 1 下载操作系统 2 下载U启动制作工具 二 磁盘分配 三 Ubuntu20 04系统安装 1 修改bios为U启动 2 安装配置Ubuntu 2 1 Install Ubuntu 2 2 安装关键之处在于分区
  • 4年经验来面试20K的测试岗,连基础都不会,还不如招应届生!

    公司前段时间缺人 也面了不少测试 结果竟然没有一个合适的 一开始瞄准的就是中级的水准 也没指望来大牛 提供的薪资在10 20k 面试的人很多 但平均水平很让人失望 看简历很多都是3 4年工作经验 但面试中 不提工具和编程 仅仅基础的技术很多
  • Flink简单教学5-时间

    时间 Time Flink支持三种不同的时间 处理时间 processing time 指当前操作的时间 如 map 当程序以处理时间运行 所有基于时间的操作 窗口 都依赖各个operator的机器时间 事件时间 event time 事件