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时解决日志乱序的工具。

引用

理解Flink之二Window与Watermark的更多相关文章

  1. Flink中的window、watermark和ProcessFunction

    一.Flink中的window 1,window简述  window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...

  2. flink中对于window和watermark的一些理解

    package com.chenxiang.flink.demo; import java.io.IOException; import java.net.ServerSocket; import j ...

  3. 深入理解Flink核心技术及原理

    前言 Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注.本文将深入分析Flink的一些关键技术与特性,希望 ...

  4. 彻底搞清Flink中的Window

    窗口 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理.当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的 ...

  5. Flink使用二次聚合实现TopN计算-乱序数据

    一.背景说明: 在上篇文章实现了TopN计算,但是碰到迟到数据则会无法在当前窗口计算,需要对其中的键控状态优化 Flink使用二次聚合实现TopN计算 本次需求是对数据进行统计,要求每隔5秒,输出最近 ...

  6. 理解ThreadLocal(之二)

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  7. 深入理解C/C++二维数组

    深入理解C/C++二维数组 前言 本来以为自己对二维数组的理解还可以,没感觉有什么,但是今天小伙伴问了一个问题感觉迷惑了好久,于是决定细致的记录一下,一步一步的探究各种关于二维数组的问题,巩固基础. ...

  8. 如何理解CPU上下文切换(二)

    如何理解CPU上下文切换(二) 1.引 你们好,可爱的小伙伴们.^_^ 多个进程竞争CPU就是一个经常被我们忽视的问题. 你们一定很好奇,进程在竞争CPU的时候并没有真正运行,为什么还会导致系统的负载 ...

  9. 深入理解zabbix(二)

    深入理解zabbix(二) 链接:https://pan.baidu.com/s/1q5YwJMTcZLcS5OQ0iOu44A 提取码:8gdi 复制这段内容后打开百度网盘手机App,操作更方便哦 ...

  10. 深入理解NIO(二)—— Tomcat中对NIO的应用

    深入理解NIO(二)—— Tomcat中对NIO的应用 老哥行行好,转载和我说一声好吗,我不介意转载的,但是请把原文链接贴大点好吗 Tomcat大致架构 先贴两张图大致看一眼Tomcat的架构 Tom ...

随机推荐

  1. python脚本之requests库上传文件

    一.前言 在学习的时候,发现有一个AWD的文件上传执行漏洞,突然想着批量对不同靶机进行操作并get_flag.思路简单,但是没构造 过文件上传的requests 的post请求的payload.便记录 ...

  2. VS code常用插件安装【持续更新】

    Auto Close Tag 自动添加HTML/XML关闭标签.例如,在输入<div>时,输入完最后一个尖括号>时,会自动添加对应的闭合标签</div> Auto Ren ...

  3. CSS – vw, vh, position fixed and ICB (initial containing block)

    什么是 vw, vh? vh 的 v 指的是 viewport, h 就是 height. 它是 CSS 值的单位就像 px, %. .container { height: 30vh; backgr ...

  4. OIDC – OpenIddict Core

    3 选 1 IdentityServer 4 本来 IdentityServer 4 一直都是首选的, 但在 2020 年他们决定成立公司, IdentityServer 5 就开始收费了. The ...

  5. 2024 ByteCTF

    ByteCTF 极限逃脱 题目描述:本题需要通过动态调试分析出要输入的内容,可能在某些地方会有提示出现. 这是一个IOS逆向,因为没有设备只能静态分析 流程和安卓逆向大概一致 解压拖进ida 提示输入 ...

  6. 【赵渝强老师】Oracle数据库的存储结构

    Oracle的存储结构分为:物理存储结构和逻辑存储结构. 一.物理存储结构:指硬盘上存在的文件 数据文件(data file) 一个数据库可以由多个数据文件组成的,数据文件是真正存放数据库数据的.一个 ...

  7. 使用KFold交叉验证方法划分训练集和验证集

    在进行深度学习时,为了提高精度,或者为了评估我们模型的优劣,以及如何选择一个更好的模型.这样我们就需要用到交叉验证方法. 我们主要实现如何使用KFold划分训练集和验证集 #coding:utf-8f ...

  8. 三维医学图像数据扩充:flip and rotate

    对于小数据量医学图像进行深度学习使,会由于数据量过小而过拟合.因此我们需要采用数据扩充方法,而flip和rotate又是经常用到的,这里做一个简单的实现. 输入为[batchsize,height, ...

  9. 线段树介绍(segment tree)

    1.引入 给定一个区间\([1, n]\),希望你实现一种数据结构,支持以下操作: 1.修改\(i\)号节点的值. 2.询问区间\([i, j]\)中所有节点的和. 这不是树状数组板子 3.修改区间\ ...

  10. 一个查询IP地理信息和CDN提供商的离线终端工具

    一个查询IP地理信息和CDN提供商的离线终端工具 Nali 功能 支持多种数据库 纯真 IPv4 离线数据库 ZX IPv6 离线数据库 Geoip2 城市数据库 (可选) IPIP 数据库 (可选) ...