分享

彻底明白Flink系统学习10:【Flink1.7】窗口生命周期、Keyed和非Keyed及分配器诠释

pig2 2018-12-12 18:17:21 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 13002
问题导读

1.窗口是什么时候开始创建的?
2.窗口删除是什么时候?
3.如何延迟窗口删除?
4.Keyed和Non-Keyed Windows有什么不同?
5.在所有的窗口中,哪一个窗口是不基于时间的?

关注最新经典文章,欢迎关注公众号


上一篇:
彻底明白Flink系统学习9:【Flink1.7编程】数据流Transformations介绍2窗口及相关操作
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26469

前面介绍了窗口的一些操作,这里介绍窗口的一些机制。Windows是处理无界流的核心。 Windows将流拆分为有限大小的“桶”,我们可以在其上应用计算。 本文介绍窗口生命周期、Keyed和Non-Keyed Windows的区别及Window Assigners

1.窗口的生命周期
简而言之,只要属于此窗口的第一个元素到达,就会创建一个窗口,当时间(事件或处理时间)超过其结束时间戳加上用户指定的允许延迟时,窗口将被完全删除。 Flink保证仅删除基于时间的窗口而不是其他类型的窗口,例如全局窗口。例如,使用基于事件时间的窗口策略,每5分钟创建一个不重叠(或翻滚)的窗口并允许延迟1分钟,当具有落入该间隔的时间戳的第一个元素到达时,Flink将为12:00到12:05之间的间隔创建一个新窗口,当水位线(watermark)到12:06时间戳时它将删除它。【这里同时我们也可以明白watermark的作用

此外,每个窗口都有一个Trigger和函数(ProcessWindowFunction,ReduceFunction,AggregateFunction或FoldFunction)。该函数将包含要应用于窗口内容的计算,而触发器指定窗口被认为准备好应用该函数的条件。触发策略可能类似于“当窗口中的元素数量大于4”时,或“当水位线通过窗口结束时”。触发器还可以决定在创建和删除之间的任何时间清除窗口的内容。在这种情况下,清除仅涉及窗口中的元素,而不是窗口元数据。这意味着仍然可以将新数据添加到该窗口。

除上述内容外,还可以指定一个Evictor(参见Evictors),它可以在触发器触发后以及应用函数之前和/或之后从窗口中删除元素。

2.Keyed和Non-Keyed Windows对比
在定义窗口之前,要指定的第一件事是流是否需要Keyed,使用keyBy(...)将无界流分成逻辑的keyed stream。 如果未调用keyBy(...),则表示流不是keyed stream。

对于Keyed流,可以将传入事件的任何属性用作key。 拥有Keyed stream将允许窗口计算由多个任务并行执行,因为每个逻辑Keyed流可以独立于其余任务进行处理。 相同Key的所有元素将被发送到同一个任务。

在Non-Keyed流的情况下,原始流将不会被分成多个逻辑流,并且所有窗口逻辑将由单个任务执行,即并行性为1。

上面我们弄明白了机制,下面从代码来看看
窗口Flink程序的一般结构如下所示。 第一个片段指的是Keyed流,而第二个片段指的是Non-Keyed 流。 可以看出,唯一的区别是对Keyed 流的keyBy(...)调用以及对于Non-Keyed 流成为windowAll(...)的窗口(...)。

代码认识

Keyed Windows
用户代码基本结构如下所示:
[mw_shl_code=scala,true]stream
       .keyBy(...)               <-  keyed versus non-keyed windows
       .window(...)              <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"[/mw_shl_code]

Non-Keyed Windows
用户代码基本结构如下所示:
[mw_shl_code=scala,true]stream
       .windowAll(...)           <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"[/mw_shl_code]
在上面,方括号([...])中的命令是可选的。 这表明Flink允许以多种不同方式自定义窗口逻辑,以便最符合各种需求。

3.Window Assigners
指定是否Keyed流之后,下一步定义窗口分配器(window assigner),窗口分配器定义如何将元素分配给窗口。这是通过在window(...)(对于keyed streams)或windowAll()(对于non-keyed streams)调用中指定所选的WindowAssigner来完成的。

WindowAssigner负责将每个传入元素分配给一个或多个窗口。 Flink带有预定义的窗口分配器,用于最常见的用例,即翻滚窗口,滑动窗口,会话窗口和全局窗口。还可以通过扩展WindowAssigner类来实现自定义窗口分配器。所有内置窗口分配器(全局窗口除外)都根据时间为窗口分配元素,这可以是处理时间或事件时间。

基于时间的窗口具有开始时间戳(包括)和结束时间戳(不包括),它们一起描述窗口的大小。在代码中,Flink在使用基于时间的窗口时使用TimeWindow,该窗口具有查询开始和结束时间戳的方法,以及返回给定窗口的最大允许时间戳的方法maxTimestamp()。


已有(3)人评论

跳转到指定楼层
huangrong 发表于 2019-5-10 11:21:00
keyed很见名知意啊
回复

使用道具 举报

美丽天空 发表于 2018-12-13 21:45:17
Flink系统学习10:窗口生命周期、Keyed和非Keyed及分配器诠释
回复

使用道具 举报

jiangzi 发表于 2018-12-13 11:33:01
Flink系统学习10:窗口生命周期、Keyed和非Keyed及分配器诠释~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条