首页 > 编程知识 正文

flink 时间,flink窗口机制

时间:2023-05-05 07:36:50 阅读:257812 作者:2561

Flink学习笔记:时间与窗口 1. 时间

在flink中定义了三类时间:

事件时间(Event Time):即事件实际发生的时间。处理时间(Processing Time):事件被处理的时间。进入时间(Ingestion Time):事件进入流处理框架的时间

下图很好的说明了三种时间的区别与联系

其中时间时间和处理时间是比较常用,根据应用程序的不同以及结果准确性要求可以定义不同的时间,在flink中应用程序中应当显示的定义时间特征

// 显示设置flink 时间特征:IngestionTime 、EventTime、ProcessingTime // 如果不设置 默认为 ProcessingTime env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

当采用事件时间定义窗口时,可以利用flink的WaterMark机制处理乱序时间流。

2. 窗口

窗口时flink中的一类算子,是DataStream的逻辑边界,用于将许多事件按照时间或者其他特征分组,从而将每一组作为整体进行分析。在开发中最常用的是时间窗口和计数窗口。

2.1 时间窗口

2.1.1 滚动窗口

滚动窗口设置

val dataSource: DataStream[(Int, Int )] = env.addSource(kafkaConsumer) .map(...) // 设置处理时间长度为30s的滚动窗口,也可以定义为事件时间的窗口 TumblingEventTimeWindows dataSource.keyBy(0) .window( TumblingProcessingTimeWindows.of( Time.seconds(30)) ) // 也可以这样写 dataSource.keyBy(0) .timeWindow(Time.seconds(30))

2.1.2滑动窗口

滑动窗口设置

// 设置处理时间滑动窗口:窗口长度为30s,步长5s dataSource.keyBy(0) .window(TumblingProcessingTimeWindows.of(Time.seconds(30),Time.seconds(5))) .sum(1) dataSource.keyBy(0) .timeWindow(Time.seconds(30),Time.seconds(5)) .sum(1)

滚动窗口和滑动窗口的区别在于滑动窗口的窗口在不同时间区间之间有重叠。

2.2 计数窗口

计数窗口与时间窗口相似,只不过分组依据不在是时间而是元素的数量,计数窗口也分为滚动计数窗口与滑动计数窗口,但是在使用计数窗口时需要注意的是,只有当元素的个数满足设定的窗口长度时才会触发该窗口的计算,如果不满足元素个数,则该窗口就不会触发计算,窗口长时间占用资源会就会造成资源浪费。一种解决办法是用时间窗口来触发超时。

// 设置窗口长度为10滚动计数窗口 dataSource.keyBy(0).countWindow(10).sum(1) // 设置窗口长度为10,步长为2的滑动计数窗口 dataSource.keyBy(0).countWindow(10,2).sum(1) 3 其他窗口

flink除了提供时间窗口和计数窗口,还提供了会话窗口,会话(session)是指一段持续活跃的期间,由活跃间隙分隔开,一个session没有固定的时长和步长,需要自己定义处理机制。例如同样是在网站购买商品,有的人经过 搜索 -> 点击 -> 购买 这三个步骤完成一次订单交易,耗时可能很长,也可能很短;有的人则是经过 搜索 -> 点击 -> 查看 ->客服沟通…购买 一系列的操作之后才完成的一次订单交易。更详细的讲解介绍可以参考以下两篇文章:Flink 原理与实现:Session Window、Flink流计算编程–看看别人怎么用Session Window。与此同时,为了满足某些特殊的需求,Flink还可以通过自定义window来实现。

参考资料

https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/event_time.html
Flink 基础教程
http://wuchong.me/blog/2016/06/06/flink-internals-session-window/#more
https://blog.csdn.net/lmalds/article/details/69267056

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。