翻译来源- Concept Timely Stream Processing

介绍

及时的流处理是有状态流处理的扩展,在计算中时间扮演一些角色。此外,当一个事件发生,当您进行时间序列分析时,基于一定的周期(通常称为窗口)进行汇总时,或者做事件处理时,时间确实是重要的。

在以下各节中,我们将重点介绍在使用及时的Flink应用程序时应考虑的一些问题。

时间概念:事件时间和处理时间

在流式程序中引用时间(例如定义窗口)时,可以引用不同的时间概念:

  • 处理时间:处理时间是指执行相应操作的机器的系统时间。

当流式程序按处理时间运行时,所有基于时间的操作(如时间窗口)将使用运行相应算子的计算机的系统时钟。每小时的处理时间窗口将包括所有到达特定算子的系统时钟指示整小时的时间之间的记录。例如,如果应用程序在9:15 am开始运行,则第一个一小时的处理时间窗口将包括在9:15 am和10:00 am之间处理的事件,下一个窗口将包括在10:00 am和11:00 am之间处理的事件,依此类推。。

处理时间是最简单的时间概念,不需要流和机器之间的协调。它提供了最佳的性能和最低的延迟。但是,在分布式和异步环境中,处理时间不能提供确定性,因为它容易受记录到达系统(例如从消息队列)速度,记录在系统内部算子之间流动速度,以及中断(调度或其他情况)的影响。

  • 事件时间:事件时间是每个事件在事件生产设备上发生的时间。通常在记录进入Flink之前将其嵌入到记录中,并且可以从每个记录中提取事件时间戳。在事件时间中,时间取决于数据,而不取决于任何时钟。事件时间程序必须指定如何生成“事件时间水印”,这是一种表示事件时间进度的机制。该水印机制将在下面的后续部分 中进行介绍。

在理想情况下,事件时间处理将产生完全一致且确定的结果,而不管事件何时到达或它们的顺序如何。但是,除非已知事件是按时间顺序(按时间戳)到达的,否则会在处理事件时间过程中因为等待无序事件导致一定的延迟。由于只能等待有限的时间,因此这限制了事件时间应用程序如何提供确定性。

假设所有数据都已到达,事件时间操作将按预期方式运行,即使在处理无序或迟到的事件或重新处理历史数据时也会产生正确且一致的结果。例如,一个一小时事件时间窗口将包含落入该小时内的带有事件时间戳的所有记录,跟它们到达的顺序或处理时间无关。(有关更多信息,请参见延迟事件部分。)

请注意,有时当事件时间程序实时处理实时数据时,它们将使用一些处理时间操作,以确保它们及时处理。

事件时间和水印

注意:Flink从数据流模型中实现了许多技术。为了对事件时间和水印有一个很好的介绍,请看下面的文章。

支持事件时间的流处理器需要一种方法来衡量事件时间进度。例如,当事件时间超过一小时的结尾时,需要通知一个构建一小时窗口的窗口算子,以便该算子可以关闭正在进行的窗口。

事件时间可以独立于处理时间(由时钟衡量的)进行。例如,在一个程序中,算子的当前事件时间可能会稍微小于处理时间(考虑到事件接收的延迟),而两者均以相同的速度进行。另外一个例子,一个流式程序,通过快速转发已经在Kafka主题(或另一个消息队列)中缓冲的一些历史数据的方式,处理遍布几周的事件时间,但处理本身的时间仅为几秒钟。


Flink中衡量事件时间进度的机制是水印。水印作为数据流的一部分流动,并带有时间戳t。一个水印(t)表明该流的事件时间已经达到时间t,这意味着不应该再有更多来自该流时间戳为 t' <= t的元素(即,比水印更早或相等的带时间戳的事件)。

下图显示了带有(逻辑的)时间戳的事件流,并且水印们按序流动。在此示例中,事件是有序的(对于它们的时间戳),这意味着水印只是流中的周期性标记。

水印对于乱序流至关重要,如下图所示,其中的事件未按其时间戳排序。通常,水印是流中点的一个声明,到某个时间戳的所有事件都应该已到达。一旦水印到达算子,算子就可以将其内部事件时间时钟推进到水印的值。

请注意,新创建的一个(或多个)流元素的事件时间继承自生成它们的事件或触发哪些元素创建的水印。

并行流中的水印

水印在源函数处生成或在源函数之后直接生成。源函数的每个并行子任务通常独立生成各自的水印。这些水印们定义了该特定并行源的事件时间。

随着水印们在流式程序中的流动,它们会推进所到达的算子的事件时间。每当算子推进其事件时间时,都会在下游为后续算子生成新的水印。

某些运算符会消耗多个输入流。例如一个union,或带有keyBy(…)或partition(…)函数的算子。这样的算子的当前事件时间是其输入流的事件时间中的最小值。随着其输入流更新其事件时间,算子也将更新。

下图展示了流经并行流的事件和水印,算子跟踪事件时间的例子。

延迟

某些元素可能会违反水印条件,意思是即使水印(t)已发生,更多带有时间戳t'<=t的元素还会发生。事实上,在许多实际情况中,某些元素可以被任意延迟,使得给所有将要发生的事件指定一个确定的事件时间戳是不可能的。 另外,延迟可以有限度,对水印太多延迟通常也不可取,因为它会在事件时间窗口计算中造成太多的延迟。

因此,流程序可能会明确地知道有晚到的元素。 迟到元素是指系统事件时间时钟(被水印标记)之后到达的元素,系统事件时间时钟已经超过迟到元素的时间戳。参考允许延迟获取更多有关如何在事件时间窗口中使用延迟元素的信息。

窗口

聚合事件(例如,计数、总和)在流上的工作方式与在批处理中不同。例如,不可能计算一个流中的所有元素,因为流通常是无限的(无界的)。相反,流上的聚合(计数、总和等)局限于窗户,例如“数过去5分钟”,或“最后100个元素的总和”.

窗户可以由时间驱动(例如:每30秒)或数据驱动(例如:每100个元素)。人们通常区分不同类型的窗户,例如翻滚的窗户(无重叠),滑动窗(重叠),以及会话窗口(由不活动间隙分割)。

请查看这个博客帖子获取更多窗口示例或查看 DataStream API的窗口文档

Flink Concept Timely Stream Processing -Flink概念及时流处理的更多相关文章

  1. 腾讯大数据平台Oceanus: A one-stop platform for real time stream processing powered by Apache Flink

    January 25, 2019Use Cases, Apache Flink The Big Data Team at Tencent     In recent years, the increa ...

  2. Stream processing with Apache Flink and Minio

    转自:https://blog.minio.io/stream-processing-with-apache-flink-and-minio-10da85590787 Modern technolog ...

  3. 《从0到1学习Flink》—— 介绍Flink中的Stream Windows

    前言 目前有许多数据分析的场景从批处理到流处理的演变, 虽然可以将批处理作为流处理的特殊情况来处理,但是分析无穷集的流数据通常需要思维方式的转变并且具有其自己的术语(例如,"windowin ...

  4. 使用flink Table &Sql api来构建批量和流式应用(1)Table的基本概念

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  5. [源码解析] 当 Java Stream 遇见 Flink

    [源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...

  6. Flink入门-第一篇:Flink基础概念以及竞品对比

    Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...

  7. Stream Processing 101: From SQL to Streaming SQL in 10 Minutes

    转自:https://wso2.com/library/articles/2018/02/stream-processing-101-from-sql-to-streaming-sql-in-ten- ...

  8. flink学习笔记-快速生成Flink项目

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  9. 使用flink Table &Sql api来构建批量和流式应用(2)Table API概述

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  10. Flink监控:Monitoring Apache Flink Applications

    This post originally appeared on the Apache Flink blog. It was reproduced here under the Apache Lice ...

随机推荐

  1. element-ui下表格头部字段hover显示tips信息

    记录一下表格头部加hover之后显示tips信息循环,或单独的el-table-column都可以哦 <el-table-column             prop="name&q ...

  2. nodejs 后台运行 forever

    一.安装nodejs //安装必要的make以及gcc,gcc-c++编译器 yum -y install make gcc gcc-c++ //获取源码 wget http://nodejs.org ...

  3. libuv 网络库设计概览译

    设计概览 libuv 是一种支持跨平台的网络库,最初是为了NodeJS作为某个模块实现的,主要基于事件驱动的I/O 模型设计的. 这个库不仅仅对不同的I/O polling 机制提供简单的抽象. ha ...

  4. 项目管理 VS. 个人计划

    注会考试临近,好好的安排一下自己的时间.做个小计划是很有必要的了. 突然想到一个软件也许可以帮到我的忙,那就微软提供的办公软件 Project,大学时候就知道Project软件的存在,但是始终没有机会 ...

  5. Cookie之记录用户上次访问时间

    Cookie之记录用户访问时间 需求: 需求: 1:用户访问服务器(Servlet),判断用户是否是第一次访问,如果是第一次访问,则在页面响应内容为:"您好,欢迎您首次访问"; 2 ...

  6. N63050 第十四周运维作业

    就业和全程班小伙伴本周学习内容: 第二十七天: http协议和web服务器 1http的cookie和session详解 2LAMP架构和CGI与FASTCGI区别 3常见PHP的配置和php程序 4 ...

  7. 记录 mysql修改密码报错问题 (ERROR 1054 (42S22): Unknown column 'password' in 'field list')

    报错如图: 查了相关文档 MySQL官网手册表示MySQL5.7版本后,password这个字段被改成 authentication_string, 命令修改如下: update user set a ...

  8. Advanced Rest Client 测试工具安装

    浏览器安装测试工具: Advanced Rest Client 1.下载插件,下载后解压 链接:https://pan.baidu.com/s/1DD5PgmkX_AG-JhUh8EVtqQ?pwd= ...

  9. page-break-after:always 打印分页

    在实现打印功能时候,可以完整分页,需要配合二维数组来使用,避免下一页数据展示到上一页

  10. react知识点-01

    1. 使用 globalContext 进行生产消费.非父子间通信