Flink

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

1. 主要组件

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

2. 集群架构

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

Master 节点(JobManager)

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

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

Worker 节点(TaskManager)

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

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

存储层

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

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

3. Flink 作业执行流程

任务提交

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

任务调度

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

任务执行

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

状态管理 & 容错

  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 配置:
    parallelism.default: 4  # 设置默认并行度为 4
    
  • 也可以通过代码指定:
    env.setParallelism(4);
    

5. Flink vs Spark 对比

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

Savepoint

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

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

Savepoint vs Checkpoint

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

如何使用 Savepoint?

触发 Savepoint

flink savepoint job_id savepoint_path

例如:

flink savepoint 123456 /flink/savepoints/

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

使用 Savepoint 恢复作业

flink run -s savepoint_path -c MainClass my-flink-job.jar

示例:

flink run -s hdfs://flink/savepoints/savepoint-1234 my-job.jar

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

删除 Savepoint

Savepoint 需要手动删除:

flink stop -s savepoint_path job_id

适用场景?

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

Savepoint vs Kafka Offset

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值