Apache Flink 的详细介绍

Apache Flink 是一个开源的分布式流处理框架,专注于高吞吐、低延迟、 Exactly-Once 语义的实时数据处理,同时也支持批处理(将批数据视为有限流)。它广泛应用于实时数据分析、实时 ETL、监控告警、欺诈检测等场景,是当前大数据实时处理领域的核心框架之一。

一、Flink 的核心定位与设计理念

Flink 的核心定位是 **“流优先”(Stream-First)**,即把所有数据都视为流:

  • 实时流(Unbounded Stream):无界、持续产生的数据(如用户行为日志、传感器数据)。
  • 批处理流(Bounded Stream):有界、可终止的数据(如历史日志文件)。

这种设计理念让 Flink 能统一处理流和批场景,避免了传统框架(如 Spark Streaming 基于微批处理)在实时性上的妥协。

二、核心特性

1. 高吞吐与低延迟
  • 基于增量计算内存管理优化,Flink 可支持每秒数百万条记录的处理,延迟可低至毫秒级(甚至亚毫秒级)。
  • 对比 Spark Streaming(微批处理,延迟通常在秒级),Flink 真正实现了 “流处理” 而非 “批模拟流”。
2. Exactly-Once 语义
  • 通过分布式快照(Checkpoint) 机制,确保数据处理结果在故障恢复后仍保持一致性(即每条数据仅被正确处理一次)。
  • 支持与外部系统(如 Kafka、MySQL)的 Exactly-Once 集成(需外部系统支持事务或 idempotent 写入)。
3. 丰富的时间语义

Flink 是首个原生支持事件时间(Event Time) 的框架,解决了数据乱序、延迟到达的问题:

  • 事件时间:数据产生的时间(如日志中的 timestamp 字段),最贴近业务真实时间。
  • 处理时间:数据被 Flink 算子处理的时间(依赖系统时钟,易受延迟影响)。
  • 摄入时间:数据进入 Flink 的时间(介于事件时间和处理时间之间)。

通过水印(Watermark) 机制,Flink 可基于事件时间触发窗口计算(如 “统计过去 10 分钟的订单量”),即使数据乱序到达也能保证结果准确性。

4. 强大的状态管理

Flink 允许算子(Operator)存储和访问中间状态(如累计计数、聚合结果),支持:

  • 状态类型
    • Keyed State:与 key 绑定的状态(如按用户 ID 分组的累计消费金额),支持 ValueState、ListState 等。
    • Operator State:算子实例级别的状态(如 Kafka 消费者的 offset)。
  • 状态后端:负责状态的存储、持久化和恢复:
    • MemoryStateBackend:状态存于内存,适合测试(不持久化,故障丢失)。
    • FsStateBackend:状态存于本地磁盘,元数据存于内存,适合中小规模状态。
    • RocksDBStateBackend:状态存于 RocksDB(嵌入式 KV 数据库),支持增量 Checkpoint,适合大规模状态(TB 级)。
5. 灵活的窗口机制

窗口是流处理的核心,Flink 支持多种窗口类型:

  • 时间窗口:基于时间划分(如滚动窗口、滑动窗口、会话窗口)。
  • 计数窗口:基于数据条数划分(如每 100 条数据一个窗口)。
  • 全局窗口:全量数据为一个窗口(需自定义触发器)。

窗口可基于事件时间或处理时间触发,且支持自定义窗口函数(如增量聚合、全量聚合)。

6. 容错与可恢复性
  • Checkpoint:自动周期性生成分布式快照,记录所有算子状态和数据位置,故障后可从最近的 Checkpoint 恢复。
  • Savepoint:手动触发的快照,用于版本升级、集群迁移等(语义与 Checkpoint 一致,但需手动管理)。

三、架构设计

Flink 采用主从架构,核心组件包括 Client、JobManager、TaskManager:

1. Client(客户端)
  • 负责将用户编写的 Flink 程序(Job)编译为执行计划(Execution Plan),并提交给 JobManager。
  • 提交后可退出或保持连接(用于监控作业状态)。
2. JobManager(主节点)
  • 核心职责:协调作业执行,包括资源申请、任务调度、Checkpoint 管理、故障恢复等。
  • 包含三个关键组件:
    • Dispatcher:接收客户端提交的作业,启动 JobMaster 并提供 Web UI 入口。
    • JobMaster:每个作业对应一个 JobMaster,负责将执行计划转换为物理计划(Execution Graph),并调度到 TaskManager 执行。
    • ResourceManager:管理集群资源(如 TaskManager 的插槽 Slot),为作业分配资源。
3. TaskManager(从节点)
  • 核心职责:执行具体的任务(Task),并管理自身资源(内存、CPU)。
  • 每个 TaskManager 包含多个插槽(Slot),每个 Slot 对应一段固定内存资源,用于运行一个或多个子任务(Subtask)。
  • 任务链(Operator Chain):Flink 会将上下游算子合并为一个 Task(减少数据传输开销),如 “Map -> Filter” 可合并为一个 Task。

四、部署模式

Flink 支持多种部署模式,适应不同集群环境:

1. Standalone 模式
  • 独立部署的 Flink 集群,包含 JobManager 和 TaskManager 进程,适合测试或小规模生产。
2. YARN 模式
  • 集成 Hadoop YARN,由 YARN 管理资源:
    • Session Mode:启动一个共享的 Flink 集群,多个作业共享资源(适合小作业)。
    • Per-Job Mode:每个作业启动一个专属 Flink 集群,作业结束后集群销毁(资源隔离性好,适合大作业)。
    • Application Mode:应用程序入口在 YARN 集群内运行(减少客户端压力)。
3. Kubernetes 模式
  • 基于 K8s 部署,支持自动扩缩容、滚动升级,适合云原生环境。
4. 其他模式
  • Mesos 模式、AWS EMR 模式等,适应不同基础设施。

五、编程模型与 API

Flink 提供多层 API,从低级到高级,满足不同场景需求:

1. 低级 API:ProcessFunction
  • 最灵活的 API,可访问事件时间、水印、状态和定时器(Timer)。
  • 适合实现复杂业务逻辑(如基于状态的动态规则匹配)。
  • 示例:KeyedProcessFunction 可处理按 key 分组的流,并通过定时器触发延迟计算。
2. 核心 API:DataStream / DataSet
  • DataStream API:处理流数据(无界 / 有界),支持 map、filter、window、keyBy 等算子。
  • DataSet API:传统批处理 API(基于有界数据),但目前已逐步被 DataStream API 的批处理模式替代(Flink 1.12+ 推荐用 DataStream 统一处理流和批)。
3. 高级 API:SQL / Table API
  • 基于 SQL 或类 SQL 的声明式 API,适合分析师或业务人员使用。
  • 支持标准 SQL 语法(如 SELECT、GROUP BY、JOIN),以及自定义函数(UDF、UDTF)。
  • 与 DataStream/DataSet API 可无缝转换(Table ↔ DataStream)。
4. 示例:DataStream 处理 Kafka 流
// 1. 创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// 2. 读取 Kafka 流(事件时间 + 水印)
DataStream<String> kafkaStream = env.addSource(new FlinkKafkaConsumer<>("user_log",new SimpleStringSchema(),kafkaConfig
)).assignTimestampsAndWatermarks(WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event, timestamp) -> parseTimestamp(event))
);// 3. 转换处理(统计每小时的用户数)
DataStream<Tuple2<String, Long>> result = kafkaStream.map(event -> parseUserId(event)) // 提取用户ID.keyBy(userId -> userId).window(TumblingEventTimeWindows.of(Time.hours(1))) // 1小时滚动窗口.aggregate(new CountAggregate()); // 聚合计数// 4. 输出到 MySQL
result.addSink(new JdbcSink<>(...));// 5. 执行作业
env.execute("UserCountPerHour");

六、连接器(Connectors)

Flink 提供丰富的连接器,支持与外部系统集成:

  • 消息队列:Kafka、RabbitMQ、Pulsar 等(支持 Exactly-Once 读写)。
  • 存储系统:HDFS、S3、HBase、Redis、Elasticsearch 等。
  • 数据库:MySQL、PostgreSQL、MongoDB 等(通过 JDBC 或专用连接器)。
  • CDC 工具:Flink CDC(基于 Debezium)支持从 MySQL、PostgreSQL 等捕获数据变更(CDC = Change Data Capture),常用于实时数据同步。

七、生态系统

Flink 生态围绕核心引擎扩展,形成完整的实时数据处理栈:

  • Flink SQL Client:交互式 SQL 客户端,支持提交 SQL 作业。
  • Flink Dashboard:Web UI 用于监控作业状态、Checkpoint 进度、算子 metrics 等。
  • Flink Stateful Functions:基于函数的无服务器(Serverless)计算框架,简化状态管理。
  • Flink Kubernetes Operator:基于 K8s 管理 Flink 作业的生命周期。
  • 集成工具:与 Apache Hive(批处理)、Apache Iceberg(数据湖)、Prometheus(监控)等无缝集成。

八、与其他框架的对比

特性FlinkSpark StreamingStorm
处理模型原生流处理微批处理(Mini-Batch)原生流处理
延迟毫秒级(低)秒级(中)毫秒级(低)
吞吐量
Exactly-Once 语义支持(Checkpoint)支持(WAL + 幂等)仅 At-Least-Once
事件时间支持原生支持模拟支持(复杂)不支持
状态管理强大(多状态类型 + 后端)有限(RDD 缓存)弱(需手动管理)

九、应用场景

  1. 实时数据分析:实时计算用户活跃度、商品销量 TOP N 等。
  2. 实时 ETL:将 Kafka 流数据清洗、转换后写入数据仓库(如 MySQL、Hive)。
  3. 监控告警:实时检测系统指标(如 QPS 突降、错误率飙升)并触发告警。
  4. 欺诈检测:实时分析交易行为,识别异常模式(如异地登录、大额转账)。
  5. 实时推荐:基于用户实时行为更新推荐列表。

十、版本与社区

  • 最新稳定版:Flink 1.18(2023 年发布),支持 Python API 增强、K8s 原生集成优化等。
  • 社区活跃:由 Apache 基金会管理,贡献者来自阿里巴巴、字节跳动、Netflix 等企业,中文资料丰富(阿里、字节有大量实践分享)。

总结:Flink 凭借流优先的设计、Exactly-Once 语义、强大的状态管理和丰富的生态,成为实时数据处理的首选框架,尤其适合对延迟和准确性要求高的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92166.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 常用控件 - 5

Qt 常用控件 - 4https://blog.csdn.net/Small_entreprene/article/details/149830464 前文补充 QRadioButton&#xff08;单选按钮&#xff09; QRadioButton 是单选按钮&#xff0c;允许在多个选项中选择一个。作为 QAbstractButton 和 QWidget 的子类&#xff0c;前面介绍…

vue的响应式原理

Vue.js 的响应式原理是其核心特性之一&#xff0c;使得数据变化能够自动更新到视图。Vue 的响应式系统主要依赖于 Object.defineProperty&#xff08;在 Vue 2.x 中&#xff09;和 Proxy&#xff08;在 Vue 3.x 中&#xff09;来实现数据的观察和更新。以下是对 Vue 响应式原理…

【AI论文】PixNerd:像素神经场扩散

摘要&#xff1a;扩散变换器目前所取得的成功在很大程度上依赖于预训练变分自编码器&#xff08;VAE&#xff09;所塑造的压缩潜在空间。然而&#xff0c;这种两阶段训练模式不可避免地会引入累积误差和解码伪影。为解决上述问题&#xff0c;研究人员选择回归像素空间&#xff…

Java中的LambdaMetafactory:动态生成Lambda的底层黑魔法

引言 在Java 8中&#xff0c;Lambda表达式作为最引人注目的新特性之一被引入。但你是否曾好奇过&#xff0c;这些简洁的Lambda表达式在底层是如何实现的&#xff1f;这就是LambdaMetafactory发挥作用的地方。作为Java语言中一个不太为人所知但极其重要的类&#xff0c;LambdaMe…

看不见的伪造痕迹:AI时代的鉴伪攻防战

在生成式人工智能飞速发展的今天&#xff0c;“眼见为实”这句话的有效性正面临前所未有的挑战。以往&#xff0c;图像篡改往往通过传统的图像处理工具&#xff08;如 Photoshop&#xff09;进行&#xff0c;需要较高的技术门槛和人工成本&#xff1b;而现在&#xff0c;仅需通…

《React+TypeScript实战:前端状态管理的安全架构与性能优化深解》

当用户在界面上进行表单提交、数据筛选等操作时,每一次交互的精准响应,都依赖于底层状态架构对风险的预判与性能的调控。深入理解如何在功能实现之外,构筑一套兼顾状态安全与运行高效的体系,是从基础开发迈向工程化实践的关键一跃。状态管理机制的设计,需要穿透“数据更新…

【android bluetooth 协议分析 01】【HCI 层介绍 30】【hci_event和le_meta_event如何上报到btu层】

一、引言 在蓝牙协议栈中&#xff0c;HCI Event 和 LE Meta Event 是控制器&#xff08;Controller&#xff09;向主机&#xff08;Host&#xff09;报告事件的两种形式&#xff0c;它们属于 HCI&#xff08;Host Controller Interface&#xff09;层。这是主机和控制器之间通…

小实验--震动点灯

1.实验目的 使用中断的方法&#xff0c;震动传感器检测到震动时&#xff0c;LED1点亮2秒&#xff0c;之后熄灭。 2.硬件清单 震动传感器STM32开发板ST-Link 3.硬件连接STM32震动传感器PA4DO3V3VCCGNDGND4.代码 4.1exti.c #include "exti.h" #include "sys.h&quo…

vcpkg: 一款免费开源的C++包管理器

目录 1.简介 2.安装 3.常用命令 4.与项目集成 5.vcpkg的工作原理 5.1.包索引&#xff1a;ports 系统&#xff08;定义库的 “元信息”&#xff09; 5.2.源码获取&#xff1a;从 “地址” 到 “本地缓存” 5.3.编译构建&#xff1a;按 “triplet” 定制目标 5.4.安装布…

WinCC通过无线Modbus TCP监控S7-1200/200SMT PLC实例详解

工业自动化系统中&#xff0c;车间内通常部署多台PLC设备并需通过中央监控平台实现集中管控。考虑到工业现场设备间距普遍在数十至数百米范围&#xff0c;传统有线以太网虽能保障传输速率&#xff0c;但其施工需面临电缆沟开挖或复杂布线工程&#xff0c;既增加线材采购、人力投…

【AI智能编程】Trae-IDE工具学习

什么是Trae&#xff1f; Trae与 AI 深度集成&#xff0c;提供智能问答、代码自动补全以及基于 Agent 的 AI 自动编程能力。使用 Trae 开发项目时&#xff0c;你可以与 AI 灵活协作&#xff0c;提升开发效率。提供传统的 IDE 功能&#xff0c;包括代码编写、项目管理、插件管理…

智能驾驶再提速!批量苏州金龙L4级自动驾驶巴士交付杭州临平区

近日&#xff0c;由苏州金龙海格客车研发的“清源”L4级自动驾驶巴士现身杭州市临平区并投入测试。这是临平区引进的首批L4级自动驾驶巴士&#xff0c;标志着临平区智能交通建设迈入新阶段。此次投入测试的“清源”小巴采用一级踏步设计&#xff0c;车身延续了海格蔚蓝巴士的经…

Spring_事务

在mysql阶段的文章中&#xff0c;已经介绍过事务了。本篇文章是对mysql事务的总结和对使用Spring框架来实现事务操作的讲解。事务回顾什么是事务事务时一组操作的集合&#xff0c;是一个不可分割的操作。事务会把所有操作作为一个整体&#xff0c;一起向数据库提交或者撤销操作…

事务管理介绍

为什么要用事务管理在我们同时操作两个或更多个数据库时&#xff0c;可能因为网络等各方面原因导致中间出现异常。造成像对第一个数据库的操作成功了&#xff0c;但是对第二个数据库的操作没有成功。这样数据的完整性就被破坏了。事务&#xff1a;是一组操作的集合&#xff0c;…

Android 之 ViewBinding 实现更安全、高效的视图绑定

​​一、配置说明​​​​作用位置​​需在模块级 build.gradle或 build.gradle.kts文件的 android {}块内添加&#xff1a;android {buildFeatures {viewBinding true // Kotlin DSL 语法} }android {buildFeatures {viewBinding true // Groovy 语法} }​​生成规则​​为每…

全球首款Java专用AI开发助手实测:一句话生成完整工程代码——飞算 JavaAI

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f;&#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d;&#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680;&#x1f340;欢迎使用&#xff1a;小智初学计算机…

Shader开发(七)创建第一个Shader项目

在前面的章节中&#xff0c;我们已经了解了Shader的基本概念和渲染管线的工作原理。现在&#xff0c;是时候动手实践了&#xff01;本章将带您一步步创建第一个Shader项目&#xff0c;开启真正的Shader开发之旅。 为什么选择openFrameworks&#xff1f; 与其他文章不同&#x…

IAR软件中测量函数执行时间

通常在调试代码中需要直到某个函数或者某段代码的实际执行时间&#xff0c;在IAR中可以直接借助软件提供的工具来计算代码执行时间。 第一种方法 进入仿真调试界面&#xff0c;在需要测量的代码前面打断点。工具栏中选择 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字节码文件(.class)的组成详解

文章目录基础信息常量池字段方法属性字节码文件内容说明案例文件基本信息类的基本信息常量池字段信息构造方法实例方法主方法源文件信息字节码文件由五部分组成&#xff0c;分别是基础信息、常量池、字段、方法、属性。案例&#xff1a; public class Main implements Interfa…

C++之vector类的代码及其逻辑详解 (下)

1. insert()这个就是在指定位置插入一个元素&#xff0c;首先计算要插入的这个位置和开头之间的距离&#xff0c;接着判断那个_finish 有没有碰到_endofstorage 或者_endofstorage 是不是为0&#xff0c;如果满足条件&#xff0c;那就进行扩容&#xff0c;然后接着重新计算距离…