← 返回文章列表

Flink 底层原理系列(一):架构概述

2021-01-03·6 分钟阅读

前言

Apache Flink 是一个分布式流处理引擎,以其出色的状态管理、精确一次语义和低延迟高吞吐能力著称。理解 Flink 的底层原理,对于构建高性能、高可用的实时数据处理系统至关重要。

本系列将从底层实现角度深入解析 Flink 的核心机制。

技术亮点

技术点难度面试价值本文覆盖
流批统一架构⭐⭐⭐高频考点
Flink 核心组件⭐⭐⭐高频考点
有界流与无界流⭐⭐基础考点
Flink vs Spark⭐⭐⭐常见问题

面试考点

  1. Flink 的核心特点是什么?为什么选择 Flink?
  2. Flink 的架构由哪些组件组成?
  3. Flink 和 Spark Streaming 有什么区别?
  4. 什么是有界流和无界流?

流批统一

┌─────────────────────────────────────────────────────────────────────────┐
│                        Flink 流批统一架构                                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  传统架构(两套系统):                                                  │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  批处理(离线)        流处理(实时)                           │   │
│  │  ┌─────────────┐      ┌─────────────┐                         │   │
│  │  │ Hadoop/Spark│      │ Storm/Flink│                          │   │
│  │  │ MapReduce   │      │ Streaming  │                          │   │
│  │  └─────────────┘      └─────────────┘                         │   │
│  │       │                     │                                  │   │
│  │       ▼                     ▼                                  │   │
│  │  两套代码、两套维护、数据不一致风险                              │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                              │                                          │
│                              ▼ Flink 解决方案                           │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │                    Apache Flink                                 │   │
│  │                 ┌───────────────┐                              │   │
│  │                 │  统一 API 层  │                              │   │
│  │                 │ DataStream    │                              │   │
│  │                 │ Table/SQL     │                              │   │
│  │                 └───────┬───────┘                              │   │
│  │                         │                                       │   │
│  │                 ┌───────▼───────┐                              │   │
│  │                 │  流处理引擎   │                              │   │
│  │                 │ Runtime      │                              │   │
│  │                 └───────┬───────┘                              │   │
│  │                         │                                       │   │
│  │         ┌───────────────┴───────────────┐                      │   │
│  │         ▼                               ▼                      │   │
│  │   ┌───────────┐                   ┌───────────┐               │   │
│  │   │ 无界流处理 │                   │ 有界流处理 │               │   │
│  │   │ (流处理)  │                   │ (批处理)  │               │   │
│  │   └───────────┘                   └───────────┘               │   │
│  │                                                                 │   │
│  │  一套代码、统一语义、流批一体                                    │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

核心特性

┌─────────────────────────────────────────────────────────────────────────┐
│                        Flink 核心特性                                    │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  1. 精确一次语义(Exactly-Once)                                        │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  通过 Checkpoint + 状态管理实现:                               │   │
│  │  • 状态一致性保证                                               │   │
│  │  • 端到端精确一次(配合 Kafka 等支持事务的外部系统)             │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  2. 高吞吐、低延迟                                                      │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  • 毫秒级延迟                                                   │   │
│  │  • 每秒处理数百万事件                                           │   │
│  │  • 高效的网络传输机制                                           │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  3. 强大的状态管理                                                      │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  • Keyed State & Operator State                                 │   │
│  │  • 多种 State Backend(Heap、RocksDB)                          │   │
│  │  • 增量 Checkpoint                                               │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  4. 事件时间处理                                                        │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  • Event Time 语义                                              │   │
│  │  • Watermark 机制                                               │   │
│  │  • 乱序数据处理                                                 │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  5. 容错能力                                                            │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  • 自动故障恢复                                                 │   │
│  │  • Checkpoint & Savepoint                                       │   │
│  │  • 细粒度恢复                                                   │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

整体架构

┌─────────────────────────────────────────────────────────────────────────┐
│                        Flink 集群架构                                    │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │                         Client                                  │   │
│  │                    (提交作业/查看结果)                           │   │
│  │                                                                 │   │
│  └───────────────────────────────┬─────────────────────────────────┘   │
│                                  │                                      │
│                                  ▼                                      │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                        JobManager                                │   │
│  │  ┌────────────────────────────────────────────────────────────┐ │   │
│  │  │                                                            │ │   │
│  │  │  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐       │ │   │
│  │  │  │   Dispatcher │ │ResourceMgr   │ │ JobMaster    │       │ │   │
│  │  │  │   (分发器)   │ │ (资源管理)   │ │ (作业管理)   │       │ │   │
│  │  │  └──────────────┘ └──────────────┘ └──────────────┘       │ │   │
│  │  │                                                            │ │   │
│  │  └────────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  └───────────────────────────────┬─────────────────────────────────┘   │
│                                  │                                      │
│              ┌───────────────────┼───────────────────┐                  │
│              │                   │                   │                  │
│              ▼                   ▼                   ▼                  │
│  ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐           │
│  │  TaskManager 1  │ │  TaskManager 2  │ │  TaskManager N  │           │
│  │  ┌───────────┐  │ │  ┌───────────┐  │ │  ┌───────────┐  │           │
│  │  │  Slot 1   │  │ │  │  Slot 1   │  │ │  │  Slot 1   │  │           │
│  │  ├───────────┤  │ │  ├───────────┤  │ │  ├───────────┤  │           │
│  │  │  Slot 2   │  │ │  │  Slot 2   │  │ │  │  Slot 2   │  │           │
│  │  ├───────────┤  │ │  ├───────────┤  │ │  ├───────────┤  │           │
│  │  │  Slot 3   │  │ │  │  Slot 3   │  │ │  │  Slot 3   │  │           │
│  │  └───────────┘  │ │  └───────────┘  │ │  └───────────┘  │           │
│  │                 │ │                 │ │                 │           │
│  └─────────────────┘ └─────────────────┘ └─────────────────┘           │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

JobManager 详解

┌─────────────────────────────────────────────────────────────────────────┐
│                        JobManager 组件                                   │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  Dispatcher(分发器)                                           │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │ • 接收作业提交                                             │ │   │
│  │  │ • 启动 JobMaster 管理作业                                  │ │   │
│  │  │ • 提供 REST API                                            │ │   │
│  │  │ • 跨作业协调                                               │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  │  ResourceManager(资源管理器)                                  │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │ • 管理集群资源(TaskManager、Slot)                        │ │   │
│  │  │ • 响应资源请求                                             │ │   │
│  │  │ • 支持多种资源管理器(YARN、K8s、Standalone)              │ │   │
│  │  │ • 资源分配与回收                                           │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  │  JobMaster(作业管理器)                                        │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │ • 管理单个作业的生命周期                                   │ │   │
│  │  │ • 协调 Checkpoint                                          │ │   │
│  │  │ • 任务调度与故障恢复                                       │ │   │
│  │  │ • 维护 ExecutionGraph                                      │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  注意:一个 Flink 集群可以有多个 JobMaster,每个管理一个作业             │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

TaskManager 详解

┌─────────────────────────────────────────────────────────────────────────┐
│                        TaskManager 组件                                  │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  TaskManager(也称为 Worker)负责执行任务和处理数据交换                   │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  核心职责:                                                     │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │                                                           │ │   │
│  │  │  1. 任务执行                                               │ │   │
│  │  │     • 执行分配给它的 Task                                  │ │   │
│  │  │     • 管理任务的生命周期                                   │ │   │
│  │  │                                                           │ │   │
│  │  │  2. 数据交换                                               │ │   │
│  │  │     • 与其他 TaskManager 交换数据                          │ │   │
│  │  │     • 管理输入/输出缓冲区                                  │ │   │
│  │  │                                                           │ │   │
│  │  │  3. 状态管理                                               │ │   │
│  │  │     • 维护本地状态                                         │ │   │
│  │  │     • 参与 Checkpoint                                      │ │   │
│  │  │                                                           │ │   │
│  │  │  4. 资源管理                                               │ │   │
│  │  │     • 管理 Task Slot                                       │ │   │
│  │  │     • 向 ResourceManager 注册                              │ │   │
│  │  │                                                           │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  │  Task Slot 示例:                                               │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │                                                           │ │   │
│  │  │  TaskManager (3 Slots)                                    │ │   │
│  │  │  ┌─────────────┬─────────────┬─────────────┐             │ │   │
│  │  │  │   Slot 1    │   Slot 2    │   Slot 3    │             │ │   │
│  │  │  │ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │             │ │   │
│  │  │  │ │ Task A  │ │ │ Task B  │ │ │ Task C  │ │             │ │   │
│  │  │  │ │ Task A' │ │ │ Task B' │ │ │ Task C' │ │             │ │   │
│  │  │  │ └─────────┘ │ └─────────┘ │ └─────────┘ │             │ │   │
│  │  │  └─────────────┴─────────────┴─────────────┘             │ │   │
│  │  │                                                           │ │   │
│  │  │  Slot 是资源隔离的基本单位                                 │ │   │
│  │  │  一个 Slot 可以执行多个 Operator Chain                     │ │   │
│  │  │                                                           │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

有界流与无界流

数据流分类

┌─────────────────────────────────────────────────────────────────────────┐
│                        有界流与无界流                                    │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  无界流(Unbounded Stream):                                            │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  特点:                                                         │   │
│  │  • 数据持续产生,没有结束                                       │   │
│  │  • 需要持续处理                                                 │   │
│  │  • 典型场景:Kafka 消息、传感器数据、日志流                     │   │
│  │                                                                 │   │
│  │  ────────────────────────────────────────────────►             │   │
│  │  1  2  3  4  5  6  7  8  9  10 ... (无限继续)                   │   │
│  │                                                                 │   │
│  │  处理模式:流式处理                                             │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  有界流(Bounded Stream):                                              │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  特点:                                                         │   │
│  │  • 数据有明确的开始和结束                                       │   │
│  │  • 可以在处理完成后释放资源                                     │   │
│  │  • 典型场景:文件、数据库表、静态数据集                         │   │
│  │                                                                 │   │
│  │  ──────────────────────────────────────────────────|            │   │
│  │  1  2  3  4  5  6  7  8  9  10 [结束]                          │   │
│  │                                                                 │   │
│  │  处理模式:批处理(流处理的特例)                               │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  Flink 的观点:批处理是流处理的特例                                     │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  批处理 = 有界流处理                                           │   │
│  │  • 使用相同的 API(DataStream)                                │   │
│  │  • 使用相同的运行时引擎                                        │   │
│  │  • 批处理可以享受流处理的优化                                  │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

对比分析

┌─────────────────────────────────────────────────────────────────────────┐
│                        Flink vs Spark Streaming                          │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  对比项        Flink              Spark Streaming              │   │
│  │  ────────────────────────────────────────────────────────────── │   │
│  │  处理模型     事件驱动            微批处理(Micro-batch)       │   │
│  │  延迟         毫秒级              秒级(由批次大小决定)        │   │
│  │  吞吐量       高                  高                            │   │
│  │  时间语义     Event Time 优先     Processing Time 优先          │   │
│  │  状态管理     强大(内置)        需要手动管理                  │   │
│  │  容错机制     Checkpoint          Checkpoint(DStream)         │   │
│  │  精确一次     支持(端到端)      支持(有限)                  │   │
│  │  流批统一     原生支持            需要两套 API(后改进)        │   │
│  │  窗口机制     丰富(滚动/滑动/会话)有限                        │   │
│  │  生态系统     起步晚,快速增长    成熟                          │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  架构对比:                                                             │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  Spark Streaming (Micro-batch):                                │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │  数据流 ──► 切分批次 ──► 批处理 ──► 结果                  │ │   │
│  │  │           (DStream)   (RDD)                               │ │   │
│  │  │                                                          │ │   │
│  │  │  延迟:取决于批次间隔(通常 500ms - 数秒)                 │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  │  Flink (Event-driven):                                         │   │
│  │  ┌───────────────────────────────────────────────────────────┐ │   │
│  │  │  数据流 ──► 逐事件处理 ──► 结果                           │ │   │
│  │  │                                                          │ │   │
│  │  │  延迟:毫秒级                                              │ │   │
│  │  └───────────────────────────────────────────────────────────┘ │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  选择建议:                                                             │
│  • 需要低延迟、复杂状态管理:选择 Flink                                │
│  • 已有 Spark 生态、批处理为主:选择 Spark Streaming                   │
│  • 需要端到端精确一次:Flink 更有优势                                  │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

典型应用场景

┌─────────────────────────────────────────────────────────────────────────┐
│                        Flink 典型应用场景                                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  1. 实时 ETL                                                            │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  Kafka ──► Flink(数据清洗/转换) ──► Kafka/HBase/ES             │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  2. 实时数据分析                                                        │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  用户行为 ──► Flink(实时聚合) ──► 指标系统/大屏                │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  3. 实时监控告警                                                        │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  日志/指标 ──► Flink(模式匹配/异常检测) ──► 告警系统          │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  4. 实时推荐                                                            │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  用户行为 ──► Flink(特征提取) ──► 推荐系统                     │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  5. 金融风控                                                            │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                                                                 │   │
│  │  交易流 ──► Flink(实时规则引擎) ──► 风控决策                   │   │
│  │                                                                 │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

总结

本章介绍了 Flink 的整体架构和核心概念:

组件职责
JobManager作业调度、资源协调、Checkpoint 协调
TaskManager任务执行、数据交换、状态管理
Client作业提交、结果查询

核心特性:流批统一、精确一次、强大状态管理、事件时间处理、毫秒级延迟。

参考资料

下一章预告

下一章将深入解析 运行时架构,包括:

  • Task Slot 与 Slot Sharing
  • 作业调度机制
  • 执行图层级(StreamGraph → JobGraph → ExecutionGraph)
分享: