Flink-JAVA开发.02-简单介绍Flink中的有关对象

本文只能简单罗列一些Flink的基本概念,无法也没有一一指出每个概念的涵义。

更多内容参见Flink的官方文档:

https://nightlies.apache.org/flink/flink-docs-release-1.20/

 

一、Flink的起源和简介

Apache Flink 起源于 2009 年德国柏林工业大学的一个研究项目 Stratosphere,这是一个由德国研究基金会资助的分布式数据处理平台研究计划。2014 年,该项目正式捐赠给 Apache 基金会,并更名为 Flink,在德语中意为“敏捷、快速”。

  • 2014 年 3 月:成为 Apache 孵化器项目

  • 2014 年 12 月:晋升为 Apache 顶级项目

  • 2015 年起:阿里巴巴大规模采用 Flink,并基于其开发了内部版本 Blink

  • 2019 年:阿里将 Blink 开源并合并入 Flink 主干,极大增强了 Flink 的 SQL 能力和性能

截止202506,Flink已经发布了2.0版本,直接从1.20跳到2.0版本。

2.0虽然没有革命性的创新,但是有了性能的极大提升和稳定性提升,并且逐渐统一编程为数据流和TableApi&sql。

二、Flink的核心能力

  1. 流批一体
  2. 能处理SQL
  3. 适配多种语言
  4. 开源并适配多种操作系统

三、Flink概貌和执行环境

Flink可以笼统表述如下:

Flink由于能够处理流,也能处理RDBMS,所以除了计算,其实也非常适合作为ETL过程中的某个部件,例如抽取、轻度清洗、加载等。

如果愿意,也能够利用它的计算能力做一些数据库计算,虽然我不是很赞成那么做。

 

有界流和无界流

有界流-有停止时机的流,到了某个节点后就没有数据

无界流-没有明确停止时机的流,除非手动停止

例如如果你要计算今日花的钱,这是有界流;如果要计算某条河流的径流量,这大体算无界流。

 

 

执行环境

此外Flink非常体贴地提供了多个执行环境,以便开发和生产,这一点非常棒。

 

在学习和开发过程中,我们通常采用本地环境即可,这样简化和方便了学些和开发的负担,这一点很重要。

有了本地执行环境,一台笔记本电脑就能够完成相对简单的学习开发环境。

 

四、Flink数据流

数据流(DataStream)无疑是Flink的核心中的核心。

以流的方式处理数据,是一个很自然而然的想法,并不值得大书特书,但Flink的妙处在于采用了很多的细节,让流处理变得简单、灵活、高效。

例如要从树上采摘9999个珍贵的水果,不多也不少,为了提升效率,自然是一边摘一边计算,而不是摘完了再计算。道理就是这样,没有特别好说的。

 

数据流有关对象大体如下:

 

窗口分类

Flink处理数据的时候,需要用到一个窗口,窗口大体分两类:

 

 

窗口是一个逻辑的概念,并不是物理的。

FLink的数据流是基于时间窗口进行计算的。

 

4.1、时间分类

时间窗口和时间相关,而时间又可以划分为:

  1. 事件时间
  2. 处理时间

这个概念很重要,否则可能结果不如意。

1. 事件时间(Event Time)

  • 定义:事件实际发生的时间,通常由数据本身携带(如日志中的时间戳、传感器记录的采集时间)。
  • 特点
    • 与数据绑定:每个事件独立携带自己的时间戳,不受系统处理速度影响。
    • 乱序容忍:支持处理延迟到达或乱序的数据(需配合水印机制)。
    • 确定性结果:相同输入数据在不同运行环境下会产生相同的输出结果。
  • 适用场景
    • 需要精确计算(如金融交易、用户行为分析)。
    • 数据可能延迟或乱序到达(如物联网设备、分布式日志)。

2. 处理时间(Processing Time)

  • 定义:事件被 Flink 处理时的系统时间(即当前时间戳)。
  • 特点
    • 与系统绑定:依赖 Flink 任务所在机器的时钟。
    • 实时性强:无需等待乱序数据,处理速度快。
    • 非确定性结果:相同输入数据可能因系统负载、网络延迟等产生不同输出。
  • 适用场景
    • 对实时性要求高且允许一定误差(如实时监控、告警)。
    • 数据顺序严格有序(如实时仪表盘)。

3、关键区别对比

维度 事件时间(Event Time) 处理时间(Processing Time)
时间来源 数据自带的时间戳(如日志中的 timestamp 字段) Flink 处理时的系统时间(System.currentTimeMillis()
乱序处理 支持(通过水印机制) 不支持(按到达顺序处理)
延迟容忍 高(可等待延迟数据) 低(立即处理,不等待)
结果确定性 确定(相同输入必得相同输出) 不确定(受系统状态影响)
性能开销 较高(需维护水印、状态) 低(直接处理)
典型应用 财务审计、用户行为分析、延迟数据统计 实时监控、实时告警、近似计

 

 

4.2、水印和水印的用处

以下内容由ai整理,基本认同。

Flink 的水印(Watermark)是处理事件时间(Event Time)乱序事件的核心机制,主要用于解决数据流中的延迟和乱序问题,确保计算结果的正确性和一致性。以下是水印的主要作用及其关键点:


1. 定义事件时间的进度

  • 事件时间(Event Time):数据实际发生的时间(例如传感器记录的时间、用户点击时间)。
  • 水印的作用:水印是一个时间戳,表示“所有事件时间小于等于该时间戳的数据都已到达”。例如,水印 T=10:00 表示系统认为不会再有事件时间早于 10:00 的数据到来(或允许一定延迟)。

2. 触发窗口计算

  • 窗口(Window):Flink 通常按时间或数据量划分窗口进行聚合计算(如每分钟统计一次点击量)。
  • 水印如何触发窗口
    • 当水印的时间戳超过窗口的结束时间时,窗口会被触发计算。
    • 例如,一个 [09:00, 10:00) 的窗口,当水印到达 10:00 时,窗口会关闭并输出结果。

3. 处理乱序事件

  • 乱序问题:由于网络延迟、分布式系统等原因,数据可能以乱序到达(例如 10:02 的事件先到,10:01 的事件后到)。
  • 水印的容错机制
    • 水印允许一定的延迟容忍度(通过 allowedLateness 参数设置)。
    • 即使水印已触发窗口,后续到达的迟到数据(事件时间早于水印)仍会被处理(更新结果或侧输出到迟到数据流)。

4. 平衡延迟与结果准确性

  • 水印生成策略
    • 周期性水印:定期生成水印(如每秒一次),适合实时性要求高的场景。
    • 标点水印(Punctuated Watermark):由特定事件触发水印生成,适合有明确标记的数据流。
  • 延迟控制
    • 水印生成越慢(等待更久),越能保证结果准确,但会引入更高延迟。
    • 需根据业务需求调整水印策略(如设置最大延迟时间)。

5. 与处理时间(Processing Time)的对比

  • 处理时间:按数据到达 Flink 的时间计算,无法处理乱序或延迟数据。
  • 事件时间 + 水印:基于数据自带的时间戳,通过水印控制计算进度,更适合需要精确结果的场景(如财务统计、用户行为分析)。

示例场景

假设一个电商平台的点击流分析:

  1. 事件时间:用户点击商品的时间(如 10:00:01)。
  2. 水印设置:允许最多 5 秒的延迟(allowedLateness=5s)。
  3. 窗口计算:每分钟统计一次点击量([10:00:00, 10:01:00))。
    • 当水印到达 10:01:05 时,触发窗口计算。
    • 如果 10:00:03 的点击在 10:01:10 才到达,仍会被处理(更新结果或存入迟到数据流)。

总结

Flink 的水印是时间语义的核心组件,它通过事件时间进度标记和延迟容忍机制,解决了乱序和延迟数据的问题,使得流计算能够在保证低延迟的同时,输出准确的结果。合理配置水印策略是优化 Flink 作业的关键步骤。

 

 

4.3、窗口分配器分类

window Assigner,中文"窗口分配器",用于构建不同的逻辑窗口,大体划分为:

 

为了便于行文,窗口分配器也简称为窗口。

其中全局窗口(GlobalWindows)比较特殊,因为它比较灵活,但是又有一定的局限性,用处多,但是编程需要小心。

五、Flink TableApi&sql

Flink的 tableApi和sql相对比较简单。

总体上,Flink的sql有点类似iso的sql。

Flink的妙处在于可以在逻辑表上执行sql,除了基本的sql,还可以执行一些聚集函数和窗口函数.

另外,Flink的tableApi支持在tableStream环境中执行。

TableApi相对简单,没有什么特别好说的。

读者注意两点即可:执行环境和执行模式、SQL

SQL参考:https://nightlies.apache.org/flink/flink-docs-release-2.0/docs/dev/table/sql/overview/

SQL是一个好东西,容易学,和好用,值得花费一些时间学习!

 

posted @ 2025-07-08 16:49  正在战斗中  阅读(11)  评论(0)    收藏  举报