前言

最近在学习流式计算相关的知识,在阅读了MillWheel论文,在这里对low watermark机制做一个总结与介绍。

Window

实时数据流是永不停歇的,我们无法获取所有的数据并产出一个最终的结果。很多情况下我们更关心的是最近的状态,而不是从实时数据流启动至今的统计数据。因此需要将数据流切分为一个个片段,这些片段形象的称为Window。总而言之,Window是将无边界的实时数据流进行划分的一种机制。

Window大体分为三种:

  • Time Window:依靠时间作为划分Window的依据,意思就是设立一个时间间隔来结束window,进行计算

    • Fixed Window:固定窗口,数据彼此不重叠
    • Sliding Window:滑动窗口,数据会重叠


  • Session Window:依靠用户的会话作为划分Window的依据
    session window主要依靠设立的时间间隔来划分一个window,即session gap。session window没有具体的结束和开始时间,当一个window中超过session gap时间还没有元素到来,该window就会结束并进行计算,此时就称为一个会话。

  • Global Window:将具有相同key的数据分配给同一个窗口,需要用户自定义触发器来进行计算,否则该window不会结束。

从中可以看出,Window的计算是非常依赖Time的。对于一个流式计算系统来说,Time分为两类,选择哪种作为划分Window的标准更好,接下里我们就介绍两种不同的Time。

Processing/Event Time

  • Processing Time:数据被处理的时间
  • Event Time:数据产生的时间
    这两个概念很好理解,Processing Time就是指数据在流式计算中,不同PE对其进行处理的时间。而Event Time就是指数据产生的时间,比如用户点击url的时间。

在流式计算早期,一般采用Processing Time作为Window划分的时间,但是这样有一个问题,当数据在上游延迟时,以Processing Time作为时间进行划分Window,就会出现误差。比如下图中的例子:

本来数据C在t3时刻产生,应当划分进t1-t3这个Window,但是由于某些原因(网络延迟等),导致数据C在t7时刻才被处理。如果按照Processing Time进行处理,那么C就落在了t4-tn的Window中,这很明显会导致计算结果的不准确。比如我们需要统计在某个时间段用户点击广告的次数,如果按照Processing Time来算,那可能有些数据就会被划分到其他window中,因此需要记录Event Time,做法也很简单,让数据携带timestamp就行了。

使用了Event Time虽然可以让数据落在正确的Window中,但是由于网络存在延迟以及各种原因,数据仍可能会迟到,如何才能让Window尽可能等待这些会迟到的数据,这也是需要考虑的问题。最直观的做法就是设置一个等待时间,但等待时间设置成多少合理,也需要考虑。为了解决这个问题,MillWheel论文中提出了lower watermark机制。

Timer

Timer即定时器,作为Window的触发源,告知Window应当开始计算了。Timer分为两类:

  • WallTime Timer:即按照正常的现实时间作为触发源
  • LowWatermark Timer:以低水位作为触发源

low watermark

low watermark其实就是一个时间戳,每个计算节点都会维护这样一个时间戳作为low watermark。为了解决这类问题,MillWheel采用了Low Watermark机制,将lwm timer作为Window的触发源。Low Watermark机制是流式系统中解决数据的完整性以及时效性问题的一种较好的方案,即为每个计算组件设立低水位值(时间戳),确保了不存在比当前时间戳还晚到达的数据,该机制的确保跟它的计算公式有关。

假设有计算节点A和C,并且C是A的上游节点,则A的低水位值的计算应该遵从以下公式。

low watermark of A = min (oldest work of A , low watermark of C : C outputs to A )

从中可以看出,A的低水位值不只和A本身的最旧数据有关,也跟上游的低水位有关。因此,只要上游还有更旧的数据存在,就会通过低水位机制维护的low watermark告知下游,下游便会更新它自己的low watermark并且由于lwm timer未触发,因此会进行等待。这样就明显形成了一个递归结构,low watermark的值与数据流的Injector有一定的关联性。

该机制是怎样解决这个问题的,这里还是给出一个例子帮助大家理解。

如图所示,A的上游有C1-Cn各点,一直追溯到源头Ij1-Ijn。A中维护了一个Window,用于统计9:30-10:00这半个小时的数据,而lwm timer为10:00,由于此时A的lwm为9:50,还没有到lwm timer,因此Window不会关闭,会等待上游滞留的数据到达。lwm(A)之所以为9:50的原因是上游的数据有延迟,min(lwm of C1…Cn)=9:50。如果按照墙上时间10:30,此时早就应该触发了,便会导致结果的不准确。

总结

关于流式计算的low watermark机制大概就是这样,它可以在一定程度上保证数据的完整性以及时效性。但实际上,若就是有数据比low watermark还晚到达仍没办法解决,比如数据在没有进入到流式计算系统之前就延误了,那low watermark根本不得而知。Flink为了尽可能解决这种情况,除了low watermark还设置了allow lateness参数,即Window被lwm timer触发后,还会等待allow lateness时间才开始计算,但这样很明显会损失一定的实时性。

由于每个流式计算系统的实现方式不一样,MillWheel又将low watermark分为两种watermark并且采用Server/Client中心化管理lwm,这里就不展开了。

流式计算-low watermark机制相关推荐

  1. TDengine3.0流式计算引擎语法规则介绍

    小 T 导读:TDengine 3.0 引入了全新的流式计算引擎,既支持时间驱动的流式计算,也支持事件驱动的流式计算.本文将对新的流式计算引擎的语法规则进行详细介绍,方便开发者及企业使用. TDeng ...

  2. 大数据凉了?No,流式计算浪潮才刚刚开始!

    AI 前线导读:本文重点讨论了大数据系统发展的历史轨迹,行文轻松活泼,内容通俗易懂,是一篇茶余饭后用来作为大数据谈资的不严肃说明文.本文翻译自<Streaming System>最后一章& ...

  3. Flink流式计算从入门到实战 三

    文章目录 四.Flink DataStream API 1.Flink程序的基础运行模型 2.Environment 运行环境 3.Source 3.1 基于File的数据源 3.2 基于Socket ...

  4. 大数据之Flink流式计算引擎

    Flink DataFlow 数据的分类 有界数据 离线的计算 效率:硬件相同的情况下:时间 无界数据 实时的计算 效率:硬件环境相同的情况下,吞吐量:数据处理的数量.延迟:结果输出的时间-数据接收的 ...

  5. Flink流式计算从入门到实战 四

    文章目录 六.Flink Table API 和Flink SQL 1.Table API和SQL是什么? 2.如何使用Table API 3.基础编程框架 3.1 创建TableEnvironmen ...

  6. flink大数据处理流式计算详解

    flink大数据处理 文章目录 flink大数据处理 二.WebUI可视化界面(测试用) 三.Flink部署 3.1 JobManager 3.2 TaskManager 3.3 并行度的调整配置 3 ...

  7. Kafka设计解析(七)- 流式计算的新贵 Kafka Stream

    http://www.infoq.com/cn/articles/kafka-analysis-part-7 Kafka Stream背景 Kafka Stream是什么 Kafka Stream是A ...

  8. 流式计算新贵Kafka Stream设计详解--转

    原文地址:https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653162822&idx=1&sn=8c4611436 ...

  9. 大数据读书笔记(2)-流式计算

    早期和当前的"流式计算"系统分别称为"连续查询处理类"和"可扩展数据流平台类"计算系统. 流式计算系统的特点: 1)低延迟 2)极佳的系统容 ...

最新文章

  1. pygame-KidsCanCode系列jumpy-part10-角色动画(上)
  2. Spring IOC(控制反转)详解及示例
  3. RabbitMQ安装方法 安装完成已验证方法步骤可行性
  4. 看完这篇文章保你面试稳操胜券——Vue篇
  5. JspWriter 与 printwriter区别
  6. 家的N次方 经典台词
  7. iphone屏幕录制_iphone投屏到电脑详细教程
  8. MSSql Server 中@@IDENTITY与SCOPE_IDENTITY()
  9. 2021-2025年中国电动门锁行业市场供需与战略研究报告
  10. 消除blur属性的边框
  11. html文档头部标记,HTML头部标记
  12. 基于再生龙(clonezilla)的系统镜像的备份和还原
  13. Erlang中的fun函数使用详解
  14. uniapp音乐播放器
  15. windows平台编译ffmpeg
  16. 多个独立索引和联合索引的选择
  17. 真正的手机密码大全!(完整版)(转)
  18. css预处理器(less学习笔记)
  19. Leetcode 1229. 安排会议日程
  20. 数学物理方法·基础③复数基本运算法则

热门文章

  1. php 自动生成sql,用PHP批量生成SQL更新语句 网页版
  2. 海信鸿蒙系统下载,鸿蒙系统的最佳用户是小米、OV?美的、格力、海信才是!...
  3. Java基础语法和面向对象代码汇总
  4. 不用加减乘除做加法运算
  5. 骚操作,这款工具可以把Kubernetes集群打包成一个镜像
  6. 重温清除浮动方法,逐句解释clearfix的意义
  7. js+css实现3D打年兽小游戏,老好玩了
  8. 蓝桥杯嵌入式(STM32G431RBT6)入门第四天——系统嘀嗒定时器(SysTick)|CSDN创作打卡
  9. 不论你是大众,科班和非科班,我这边整理很久,总结出的学习路线,还不快卷起来
  10. c语言学号姓名德育学分,学生德育信息管理系统.cpp