Flink学习笔记(四):Window与WaterMark

本文介绍了Flink中的时间概念,包括Event Time、Ingestion Time和Processing Time,并详细讲解了Window机制,特别是CountWindow和TimeWindow的使用,以及Watermark在处理乱序事件中的作用。通过实例展示了如何设置和使用Watermark来确保窗口正确执行。
摘要由CSDN通过智能技术生成

1.Time

在Flink的流式处理中,会涉及到时间的不同概念

  • Event Time:事件时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳
  • Ingestion Time:注入时间。是数据进入Flink的时间
  • Processing Time:处理时间。是每一个执行基于时间操作的算子的本地系统时间,与机器相关,在使用时间窗口时默认的时间属性就是ProcessingTime

例如一条日志进入Flink的时间为2017-11-12 10:00:00.123 到达window的系统时间为 2017-11-12 10:00:01.234,日志内容如下:

2017-11-02 18:37:15.624 INFO Fair over to rm2

那么这条数据的:

  • Event Time:2017-11-02 18:37:15.624
  • Ingestion Time:2017-11-12 10:00:00.123
  • Processing Time:2017-11-12 10:00:01.234

对于业务来说,要统计1min内的故障日志个数,哪个时间是最有意义的?----- eventTime,因为我们要根据日志的生成时间进行统计。

2.Window

窗口是一种机制,其将许多事件按照时间或者其他特征分组,从而将每一组作为整体进行分析。
为什么要引入window的概念?
因为要对数据做聚合操作,不可能对无界数据进行聚合,window机制将无界数据转为有界数据。Flink 目前支持两类5种窗口:

  1. 计数窗口(count window):按照指定的数据条数生成一个window,与时间无关。又分为滚动窗口、滑动窗口
  2. 时间窗口(time window):按照时间生成window。默认按照Processing Time来划分Window。又分为滚动窗口、滑动窗口、会话窗口

Window API演示
以经典的词频统计来展示api的用法

2.1 CountWindow

CountWindow根据窗口中相同key元素的数量来触发执行,执行时只计算元素数量达到窗口大小的key对应的结果。
注意:CountWindow的window_size 指的是相同key的元素的个数,不是输入的所有元素的总数。
滚动窗口

import org.apache.flink.api.java.tuple.Tuple
// 导入包这里要特别注意:直接将这个scala包下的所有类全部导进来
// 否则有可能出现隐式转换的错误
import org.apache.flink.streaming.api.scala._

/**
  * CountWindow 中的滚动窗口(Tumbling Windows)
  * 将数据依据固定的窗口长度对数据进行切分。
  */
object TimeAndWindow {
   
  def main(args: Array[String]): Unit = {
   

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val stream: DataStream[String] = env.socketTextStream("localhost",11111)
    val streamKeyBy: KeyedStream[(String, Long), Tuple] = stream.map((_,1L)).keyBy(0)
    //注意:CountWindow的window_size 指的是相同key的元素的个数,不是输入的所有元素的总数。
    //注意:KeyedStream才有countWindow和timeWindow方法
    //加了窗口的流会变成windowedStream,就可以做聚合操作了,例如reduce、sum等
    val streamWindow: DataStream[(String, Long)] = streamKeyBy.countWindow
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值