flink介绍

Apache Flink 是一个分布式流处理框架 ,支持 有状态(Stateful)计算 ,能够处理流式(Streaming)和批量(Batch)数据 。Flink 采用主从架构 ,由 JobManagerTaskManager 共同协作完成任务调度和计算。

Flink 的核心架构主要由以下组件组成:

  1. Client(客户端)
    • 提交 Flink 任务 到集群
    • 解析用户代码并生成 JobGraph ,提交给 JobManager
  2. JobManager(主节点)
    • 负责任务的 调度、资源分配、故障恢复
    • 主要由 Dispatcher、ResourceManager、JobMaster 组成
  3. TaskManager(工作节点)
    • 负责具体的 任务执行
    • 运行 TaskSlot ,并处理 数据流、状态管理
  4. Storage(存储)
    • 任务的**检查点(Checkpoint)保存点(Savepoint)**存储在 HDFS、S3、RocksDB 等外部存储中
    • 任务的输入和输出数据存储在 Kafka、HDFS、MySQL、Elasticsearch 等

Flink 采用 Master-Slave(主从)架构 ,主要包含 JobManager (主节点) 和 TaskManager(从节点)。

(1)Master 节点(JobManager)

JobManager 负责任务管理和调度,主要组件:

  • Dispatcher(调度器)
    • 负责接收 Client 提交的任务
    • 提供 REST API 接口,允许用户查询任务状态
  • ResourceManager(资源管理器)
    • 负责管理 Flink 计算资源
    • YARN / Kubernetes / Mesos 协作,动态分配 TaskManager
  • JobMaster(作业管理器)
    • 负责管理 Flink 任务的执行
    • 维护 ExecutionGraph(执行图)
    • 处理 故障恢复

(2)Worker 节点(TaskManager)

TaskManager 负责执行具体任务,包含:

  • TaskSlot(任务槽)
    • 任务的最小资源单位,每个 TaskManager 有多个 TaskSlot
    • Slot 之间内存相互隔离
  • Task(任务)
    • 执行 算子(Operators)
    • 通过 数据流(Stream) 进行计算

(3)存储层

Flink 需要持久化存储以下数据:

  1. 检查点(Checkpoint) → HDFS、S3、RocksDB
  2. 状态(State)存储 → RocksDB、内存
  3. 输入(Source)数据 → Kafka、MySQL、HDFS
  4. 输出(Sink)数据 → Elasticsearch、HDFS、Redis

(1)任务提交

  1. Client 提交 Flink Job
    • 解析代码,生成 JobGraph
    • 发送 JobGraph 到 Dispatcher
  2. Dispatcher 分配 JobMaster
    • 启动 JobMaster 处理任务
    • JobMaster 解析 JobGraph ,构造 ExecutionGraph

(2)任务调度

  1. JobMaster 解析 ExecutionGraph
    • 将 JobGraph 转换为并行执行图(ExecutionGraph)
    • 按算子依赖关系进行任务切分
  2. ResourceManager 分配 TaskManager
    • 申请 TaskSlot
    • 分配 TaskManager 并启动 Task 任务

(3)任务执行

  1. TaskManager 启动 Task
    • 运行算子(Operators)
    • 处理数据流(Stream)
  2. 数据传输
    • 通过 Shuffle、Network Stack 传输数据
    • 任务之间通过 流(Stream) 传递数据

(4)状态管理 & 容错

  1. Checkpoint 机制
    • 定期将 Task 状态 持久化到 HDFS、RocksDB
    • 任务故障时,从最近的 Checkpoint 恢复
  2. Savepoint 机制
    • 手动触发 Savepoint,支持 作业升级、代码变更后的恢复
  3. Failover
    • 任务失败后,JobMaster 重新调度任务,恢复计算

Flink 是 并行计算框架,并行度的定义如下:

  1. 全局并行度(Global Parallelism)
    • execution.parallelism 决定,影响整个 Job
  2. 算子级别并行度(Operator Parallelism)
    • 可以通过 operator.setParallelism(n) 设置
  3. Task Slot 数量
    • 每个 TaskManager 有多个 TaskSlot,影响作业运行

默认并行度

  • Flink 默认并行度为 1 ,可以在 flink-conf.yaml 配置:

    yaml 复制代码
    parallelism.default: 4  # 设置默认并行度为 4
  • 也可以通过代码指定:

    java 复制代码
    env.setParallelism(4);
对比项 Flink Spark
计算模式 流计算(Streaming First) 批计算(Batch First)
数据流模型 实时流(Unbounded Stream) 微批处理(Micro-batch)
状态管理 内置状态管理(RocksDB) 依赖外部存储(HDFS、Redis)
故障恢复 精准一次(Exactly Once) 依赖 RDD 重计算
吞吐量 高吞吐、低延迟 吞吐量高但延迟较高
并行计算 Task Slot 控制并行度 RDD Partition 控制并行度

6. 结论

Flink 采用 Master-Slave 架构 ,由 JobManager(主节点)+ TaskManager(工作节点)+ 存储层 组成

支持流计算和批计算 ,以 流计算优先(Streaming First) 为核心

高并发低延迟 ,支持 Exactly Once 语义 ,适用于 实时计算场景

任务并行度由 Task Slot、算子并行度决定 ,默认并行度为 1,可调整

与 Spark 相比,Flink 在实时流计算方面更强,而 Spark 在离线计算更优秀

Savepoint

1. 什么是 Savepoint?

Savepoint 是 Flink 提供的一种手动触发的作业状态快照机制,用于:

  • 任务升级、迁移(跨版本、跨集群恢复)
  • 故障恢复(比 Checkpoint 更灵活)
  • A/B 测试(从相同状态启动不同版本任务)

2. Savepoint vs Checkpoint

对比项 Savepoint Checkpoint
触发方式 手动触发 自动触发(周期性)
存储内容 作业完整状态(可跨版本恢复) 任务运行状态(仅用于故障恢复)
存储位置 HDFS / S3 / RocksDB / 文件系统 HDFS / S3 / RocksDB
用途 任务升级、迁移、测试 任务失败后自动恢复
适用场景 长期存储,版本切换 临时存储,断点恢复
数据一致性 需要手动触发,非实时 端到端 Exactly-Once

总结

Savepoint 适用于长期存储和版本迁移

Checkpoint 适用于作业自动恢复

3. 如何使用 Savepoint?

3.1 触发 Savepoint

bash 复制代码
flink savepoint job_id savepoint_path

例如:

bash 复制代码
flink savepoint 123456 /flink/savepoints/

说明job_id 是 Flink 任务 ID,savepoint_path 指定 Savepoint 存储位置(HDFS、S3等)。

3.2 使用 Savepoint 恢复作业

bash 复制代码
flink run -s savepoint_path -c MainClass my-flink-job.jar

示例:

bash 复制代码
flink run -s hdfs://flink/savepoints/savepoint-1234 my-job.jar

说明-s 参数指定 Savepoint 位置,作业会从 Savepoint 处继续执行。

3.3 删除 Savepoint

Savepoint 需要手动删除:

bash 复制代码
flink stop -s savepoint_path job_id

4. Savepoint 适用于哪些场景?

  1. 任务升级
    • 旧版本任务 触发 Savepoint,新版本任务从 Savepoint 恢复
    • 例如升级 Flink 作业时,保证状态不丢失
  2. 跨集群任务迁移
    • 不同 Flink 集群 之间迁移作业
    • 先在 A 集群 Savepoint,然后在 B 集群加载 Savepoint
  3. A/B 测试
    • 从同一个 Savepoint 启动多个作业,对比不同算法版本效果

5. Savepoint vs Kafka Offset

对比项 Savepoint Kafka Offset
作用 存储 Flink 作业的所有状态 存储 Kafka 消费者消费位点
适用范围 所有 Flink 状态(窗口、聚合等) 仅流式 Kafka 消费 Offset
是否支持作业升级 ✅ 支持 ❌ 不支持
存储方式 HDFS / S3 / RocksDB Kafka 内部存储

Savepoint 适用于 Flink 作业状态恢复

Kafka Offset 适用于 Kafka 消费恢复

6. 总结

  • Savepoint 适用于手动触发的状态持久化,用于任务升级、迁移、A/B 测试
  • Checkpoint 适用于自动任务恢复,用于故障恢复
  • Flink 任务可以从 Savepoint 恢复,保持状态一致
  • Savepoint 需要手动管理和存储,Checkpoint 是临时的
相关推荐
图图图图爱睡觉40 分钟前
用大白话解释搜索引擎Elasticsearch是什么,有什么用,怎么用
大数据·elasticsearch·搜索引擎
B站计算机毕业设计超人44 分钟前
计算机毕业设计Python+DeepSeek-R1大模型考研院校推荐系统 考研分数线预测 考研推荐系统 考研(源码+文档+PPT+讲解)
大数据·python·毕业设计·课程设计·数据可视化·推荐算法·毕设
哲讯智能科技1 小时前
MES:开启生产制造优秀管理新时代
大数据
补三补四2 小时前
因子有效性的审判使者——回测分析【量化实践】
大数据·人工智能·算法·金融·数据分析
每天瞎忙的农民工2 小时前
Doris、ClickHouse 和 Flink 这三个技术典型的应用场景
大数据·clickhouse·flink·doris
m0_748248232 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
开利网络3 小时前
搭建数字化生态平台公司:痛点与蚓链解决方案
大数据·运维·人工智能·搜索引擎·信息可视化
狮歌~资深攻城狮3 小时前
Flink与Spark对比:大数据领域的“双雄争霸
大数据
kngines3 小时前
【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.2Kibana可视化初探
大数据·elasticsearch·搜索引擎