理解Flink之二Window与Watermark
Flnk作为流式计算平台,他能对源源不断发送过来的数据进行处理。
对于数据流的处理方式,可以是来一条处理一条(pipeline的方式),还可以获取一些数据然后统一处理。
对于数据流如何描述一堆数据呢?就是通过Window的概念。
Window
Window翻译为窗口,相当于将流式数据进行逻辑切割,那么可以将Window内的数据看成一个整体。我们就可以对Window内的数据进行聚合、排序等操作。
对于流式数据来说,划分Window的方式必然和Time有关。在Flink中Window分为两种TimeWindow和GlobalWindow。TimeWindow包含起始时间,GlobalWindow是没有结束时间的TimeWindow。其实你也可以理解为只有一种Window。
划分Window不是目的,目的是能对Window中的数据进行处理。
那么,我们需要知道Window中的数据什么时候采集结束?所以在Window的操作中需要设置trigger,当Window中的数据满足某个条件时触发trigger,表示Window中的数据已经采集完了,开始下面的计算吧。
方式可以有:
- CountTrigger window中事件数量达到某个值时触发计算
- EventTimeTrigger window中包含某个时间点的事件时触发计算
...
对于,数据到底应该进入哪个Window(有可能一条数据可以进入多个Window)?Flink中通过设置WindowAssigner来实现。其实就是如何划分时间轴。
- GlobalWindows 表示 整个流为一个整体的Window
- TumblingEventTimeWindows 表示 两两Window紧密相连
- SlidingEventTimeWindows 表示 有交集的Window
...
Flink中还为Window添加了一种操作,当触发计算后,你可以删除Window中的某些事件。这个需求可以通过设定Evictor来实现。
这就是Flink中对于Window的操作。
Watermark
那Watermark的作用呢?
在流式数据中日志不断的进入Flink系统,在Flink中定义了三种时间:EventTime、IngestTime、ProcessTime。
- EventTime 表示日志中自带的时间
- IngestTime 表示日志进入Flink系统的时间
- ProcessTime 表示Flink处理日志的时间
在上面Window中说道,Window是基于时间对日志进行逻辑切割,那么时间以什么为基准呢?在Flink系统中可以通过设置上述的时间来确定基准时间,默认是ProcessTime。
虽然有三种时间但是EventTime和IngestTime/ProcessTime有一个很大的区别,对于Flink系统来说IngestTime/ProcessTime一定是有序的,而EventTime而不一定(大概率是乱序的)。
那么当我们以EventTime为基准来分割Window时,则可能就会出现原本是Window A中的数据,而在Window D时才进入Flink系统(认为在时间上Window A比Window D早)。
如果我们希望晚到的数据也能进入在本来应该进入的Window A中去呢?这时候Flink设计了Watermark来解决这个问题。
Watermark实现的功能是用户通过设置Watermark的生成规则来手工的指定何时触发Window计算。
常用的方式是让Watermark延时一段时间生成。这也可以将Window之外的一部分日志也计入该Window。但是,这个预估的延时不能完美的解决乱序的问题。
所以Watermark是在当基准时间设置为EventTime时解决日志乱序的工具。
引用
- https://yq.aliyun.com/articles/225624
- http://www.justdojava.com/2019/12/01/flink_learn_window/
- http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/
- http://wuchong.me/blog/2016/06/06/flink-internals-session-window/
理解Flink之二Window与Watermark的更多相关文章
- Flink中的window、watermark和ProcessFunction
一.Flink中的window 1,window简述 window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...
- flink中对于window和watermark的一些理解
package com.chenxiang.flink.demo; import java.io.IOException; import java.net.ServerSocket; import j ...
- 深入理解Flink核心技术及原理
前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注.本文将深入分析Flink的一些关键技术与特性,希望 ...
- 彻底搞清Flink中的Window
窗口 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理.当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的 ...
- Flink使用二次聚合实现TopN计算-乱序数据
一.背景说明: 在上篇文章实现了TopN计算,但是碰到迟到数据则会无法在当前窗口计算,需要对其中的键控状态优化 Flink使用二次聚合实现TopN计算 本次需求是对数据进行统计,要求每隔5秒,输出最近 ...
- 理解ThreadLocal(之二)
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...
- 深入理解C/C++二维数组
深入理解C/C++二维数组 前言 本来以为自己对二维数组的理解还可以,没感觉有什么,但是今天小伙伴问了一个问题感觉迷惑了好久,于是决定细致的记录一下,一步一步的探究各种关于二维数组的问题,巩固基础. ...
- 如何理解CPU上下文切换(二)
如何理解CPU上下文切换(二) 1.引 你们好,可爱的小伙伴们.^_^ 多个进程竞争CPU就是一个经常被我们忽视的问题. 你们一定很好奇,进程在竞争CPU的时候并没有真正运行,为什么还会导致系统的负载 ...
- 深入理解zabbix(二)
深入理解zabbix(二) 链接:https://pan.baidu.com/s/1q5YwJMTcZLcS5OQ0iOu44A 提取码:8gdi 复制这段内容后打开百度网盘手机App,操作更方便哦 ...
- 深入理解NIO(二)—— Tomcat中对NIO的应用
深入理解NIO(二)—— Tomcat中对NIO的应用 老哥行行好,转载和我说一声好吗,我不介意转载的,但是请把原文链接贴大点好吗 Tomcat大致架构 先贴两张图大致看一眼Tomcat的架构 Tom ...
随机推荐
- github代理加速
终端命令行 支持终端命令行 git clone , wget , curl 等工具下载.支持 raw.githubusercontent.com , gist.github.com , gist.gi ...
- 【笔记】利用七牛云CDN加速提高前端图片静态资源访问速率
第一步,注册七牛云账号 打开 七牛开发者平台,选择 注册,注册后登录系统然后实名认证. 第二步,创建七牛云空间 七牛对象存储将数据文件以资源的形式上传到空间中.您可以创建一个或者多个空间,然后向每个空 ...
- JavaScript Library – Svelte
前言 上一回我介绍了 Alpine.js.作为我开发企业网站 draft 版本的 render engine. 用了一阵子后,我觉得它真的非常不好用.所以打算换一个. 前端有好几个 framework ...
- EF Core – Get Started 搭建单侧环境
有时候想搭个环境做测试, 又记不住那些 command, 官方教程又啰嗦. git clone 模板又不太好管理, 索性记入在这里吧. 创建项目 dotnet new webapp -o Simple ...
- 大模型应用开发初探 : 通用函数调用Planner
大家好,我是Edison. 上一篇,我们了解了什么是AI Agent以及如何用Semantic Kernel手搓一个AI Agent.有朋友留言说,自动函数调用对大模型有较高的要求,比如Azure O ...
- MyBatisPlus——标准数据层开发
标准数据层开发 标准数据层CRUD功能 lombok 一个java类库,提供了一组注解,简化POJO实体类开发 常用注解@Data 为当前实体类在编译期设置对应的get/set方法,无参/ ...
- GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) 2.7.0发布 新增各项优化与BUG修复
前言 时隔大半年,终于抽出空来可以更新这个组件了 (边缘化了,大概要被裁员了) 2.7.0终于发布了~ 更新内容: 1.添加API类任务的超时时间,可以通过全局配置也可以单个任务设置 2.设置定时任务 ...
- USB协议详解第8讲(USB描述符-字符串和语言ID描述符)
1.字符串描述符相关概念 字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字.产品名字.产品序列号.各个配置名字.各个 ...
- iOS文本字数动态展示使用小结
项目开发中经常用到类似这样的功能,文本输入的时候需要动态的显示文本输入字数.这里以多行文本框为例,介绍一下实现方案.核心代码如下 -(void)textViewDidChange:(UITextVie ...
- k8s的pod的理解
pod共享相同的IP地址和端口空间. 这意味着在同一 pod中的容器运行的 多个进程需要注意不能绑定到相同的端口号, 否则会导致端口冲突, 但这只涉及同一pod中的容器. 由于每个pod都有独立的端口 ...