Windows

窗口是处理无限流的核心,Windows 将流拆分成有限大小的桶

我们可以在其上进行计算。

当前,在窗口操作是用在keyed streams

Keyed Windows

stream
       .key_by(...)
       .window(...)              <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.allowed_lateness(...)]   <-  optional: "lateness" (else zero)
       .apply/process()          <-  required: "function"
       
Window Lifecycle #窗口生命周期#

简言之, 属于该窗口的第一个元素到达后,就会立即创建一个窗口

当时间(event or processing time) 超过器结算时间戳加上用户指定的允许延迟,

窗口将会被完全删除。

Flink保证删除基于事件的窗口, 而不保证其他类型的窗口

此外, 每个窗口会有一个Trigger和一个函数(WindowFunction or ProcessWindowFunction)

这个函数将包含应用于窗口内容计算, 而触发器指定了被认为应用函数的条件

一个触发策略可能是当窗口中的元素数量超过4个

或者 当水位查过了窗口的末尾 。

触发器还可以决定随时清除窗口内容 在创建和删除窗口之间

Keyed Windows #

第一件事 是指定是否应该对流进行 keyed操作

这必须在定义窗口前完成, 使用key_by(…) 会将无限的流拆分为逻辑键控流

any attribute of your incoming events can be used as a key (more details here).

如果key_by(...)  没有被调用, 你的流没有被keyed

在keyed 流的情况下,传入的事件的任何属性可以用于作为一个key

拥有一个keyed stream 会允许你的窗口计算被并行执行通过多个任务

因为每个logical keyed stream 可以单独处理

引用到相同key的元素会发送到相同的并行任务

Window Assigners # 窗口分配器

After specifying your stream is keyed, 下一步就是定义一个窗口分配器

window assigner 定义元素时如何被分配给不同窗口的

这是通过指定您选择的WindowAssigner来完成的。

WindowAssigner 是负责将传入的每个元素分配给1个或者多个窗口

你可以通过扩展WindowAssigner类来实现自定义窗口分配器

基于事件创建有一个开始时间戳和一个结束时间戳

他们一起描述了窗口的大小.

在代码中, Flink在处理基于事件的窗口时使用TimeWindow

这个窗口有查询开始和结束的时间戳方法

在下文中,我们将展示如何自定义滑动窗口分配器

from typing import Tuple, Collection

from pyflink.common.serializer import TypeSerializer
from pyflink.datastream import WindowAssigner, Trigger
from pyflink.datastream.window import TimeWindow, TimeWindowSerializer

class TumblingEventWindowAssigner(WindowAssigner[Tuple, TimeWindow]):

def __init__(self, size: int, offset: int, is_event_time: bool):
        self._size = size
        self._offset = offset
        self._is_event_time = is_event_time

def assign_windows(self,
                       element: Tuple,
                       timestamp: int,
                       context: WindowAssigner.WindowAssignerContext) -> Collection[TimeWindow]:
        start = TimeWindow.get_window_start_with_offset(timestamp, self._offset, self._size)
        return [TimeWindow(start, start + self._size)]

def get_default_trigger(self, env) -> Trigger[Tuple, TimeWindow]:
        return EventTimeTrigger()

def get_window_serializer(self) -> TypeSerializer[TimeWindow]:
        return TimeWindowSerializer()

def is_event_time(self) -> bool:
        return False

Window Functions #

在定义了窗口分配器后,我们需要指定每个窗口上执行的计算

这是窗口函数的功能,它用于在系统确定窗口准备好进行处理后处理每个键控窗口的元素(请参阅Flink如何确定窗口何时准备好的触发器)。

窗口韩式可以是ProcessWindowFunction or WindowFunction.

他们为窗口的所有的elements 获取一个迭代器

在某些可以使用ProcessWindowFunction的地方,您也可以使用WindowFunction。

这是一个ProcessWindowFunction 的旧版本 提供的上下文信息较少

没有一些高级功能,例如 每个窗口keyed状态

ProcessWindowFunction   窗口处理函数

一个ProcessWindowFunction 获得一个包含所有窗口元素的Iterable

以及一个可以访问时间和状态信息的Context 对象

这个让它可以提供相比其他窗口函数更多的灵活性

这是以性能和资源消耗为代价的,因为元素不能增量聚合,而是需要在内部缓冲,直到窗口被认为可以处理为止

key参数是通过 key_by()调用指定的KeySelector提取的键。

WindowFunction #

在某些地址 可以使用ProcessWindowFunction ,你也可以使用WindowFunction

这是ProcessWindowFunction的旧版本,提供的上下文信息较少

Triggers  触发器

一个触发器决定窗口何时被处理 通过窗口函数,

关于上述方法需要注意的两件事:

Fire and Purge #

一旦触发器确定窗口准备上处理,它就会启动 它返回FIRE or FIRE_AND_PURGE.

这是窗口操作员发出当前窗口结果的信号。给定一个带有ProcessWindowFunction的窗口,所有元素都会传递给ProcessWindowFunction。

当触发器触发时, 它可以是IRE or FIRE_AND_PURGE

FIRE 保留窗口的内容

FIRE_AND_PURGE 删除它的内容

允许的延迟#

使用事件时间窗口时,可能会出现元素延迟到达的情况,即Flink用于跟踪事件时间进度的水印已经超过元素所属窗口的结束时间戳。请参阅活动时间,尤其是后期元素,以更深入地讨论Flink如何处理活动时间。

默认情况下,当水印超过窗口末尾时,会删除后期元素。但是,Flink允许为窗口操作员指定允许的最大延迟。允许延迟指定元素在被丢弃之前可以延迟的时间,其默认值为0。在水印经过窗口末尾之后但在它经过窗口末尾加上允许的延迟之前到达的元素仍然被添加到窗口中。根据使用的触发器,延迟但未掉落的元素可能会导致窗户再次启动。

为了实现这一点,Flink保持窗口的状态,直到它们允许的延迟

Windows 窗口相关推荐

  1. Windows窗口的建立

    Windows窗口的建立 预备知识 DC CreateCompatibleDC() CreateDIBSection() SelectObject() BitBlt() CODE 设备上下文 (简称为 ...

  2. 创建windows窗口并且获得窗口句柄

    创建windows窗口并且获得窗口句柄 代码 import win32gui from win32con import * import ctypes from ctypes import * def ...

  3. Python+selenium自动化测试中Windows窗口跳转方法

    第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 driver.find_element_by_name("xxx&quo ...

  4. 怎么取消任意Windows窗口总在最前

    windows7下取消任意Windows窗口总在最前 最简单的办法是右键下边的任务栏,选择取消锁定任务栏后,再锁定一下.

  5. 【MFC】Windows窗口样式

    00. 目录 文章目录 00. 目录 01. 框架窗口样式 02. 静态样式 03. 窗口样式 04. 扩展的窗口样式 05. 附录 01. 框架窗口样式 框架窗口样式适用于 CFrameWnd 类 ...

  6. Windows窗口刷新机制详解

    1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...

  7. 【转】win32 的DLL中创建windows窗口

    转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...

  8. c++mfc编写实验_零基础学Windows窗口图形界面编程(不用MFC),菜鸟学完变身高手,敢与专业媲美...

    又一门新的计算机课上线啦! 什么课?看下面视频(以下视频是本课第一讲) 用什么语言 我们声明一下(这个在我们课上也跟同学强调):不要为用什么语言掐架!那是初学者的行为,为高手所不为. 第二,我们这门课 ...

  9. windows窗口移动到屏幕外,找回方法

    windows窗口移动到屏幕外,找回方法 1.将应用程序切换到激活状态:alt + tab 切换到应用程序 或 鼠标点任务栏(激活状态) 2.alt + 空格键(激活菜单) 3.alt + m (移动 ...

  10. CWnd类与Windows窗口的关系-3、CWnd类如何封装Windows窗口

    现在,可以比较深入地对CWnd类的封装机制进行剖析了. 在建立窗口句柄映射方面,CWnd使用了一个未公开的类CHandleMap进行管理.使用CWnd及派生类创建窗口时,建立了句柄映射,在窗口销毁时删 ...

最新文章

  1. fiddler 在火狐(firefox)下无效的问题 ——Fiddler监听Firefox、Chrome中的http请求
  2. TiDB 官方设计文档翻译(一)
  3. JedisConnectionException: java.Net.SocketTimeoutException: Read timed
  4. git冲突解决办法合集
  5. 公司采购 流程flowable例子
  6. Could not retrieve transaction read-only status from server
  7. Django权限管理测试
  8. [转]华人总结“十个”出了国才能知道秘密!
  9. c#物联网_「物联网架构」Apache-Kafka:物联网数据平台的基石
  10. 处理器核(core)、处理器(cpu)区别
  11. 四级恋练有词课程 (10课时-朱伟)导学
  12. 文件系统可视化与文件管理
  13. 利用冒泡法对10个数字进行排序
  14. 360度全景标定方法_一种车辆行驶360度全景行车标定板的制作方法
  15. 用 Java3D 写游戏
  16. python-测试框架nose(nosetests)简介
  17. 分治法的思想与经典题目
  18. 如何有效地召开会议?
  19. 4、Python基本数据类型之字典,集合
  20. 搜索引擎是如何最大化关键字广告收益的

热门文章

  1. 使用 Python 自定义 APISIX 插件
  2. conda 环境中 一些包安装问题总结
  3. 手把手教你实现手绘风格图形
  4. Power PC 与 zynq数据交互(基于LocalBus)
  5. C语言 平均数 中位数 众数
  6. 自动驾驶车会阅读街上人们的肢体语言了
  7. cropped-11111111111111111.jpg
  8. 在本地安装divi主题 —— 详细步骤
  9. 2021美赛数据分析全网首发(R语言 )
  10. 于学军理事长莅临2023玉米深加工产业展,行业翘楚齐聚