Flink底层核心

1. 核心组件

JobManager

JobManager 是 Flink 集群的控制中心,负责调度、管理和协调整个作业的执行。它的主要职责包括:

  • 作业提交:接收用户提交的作业,生成执行计划。
  • 任务调度:将作业划分为子任务,并分配到不同的 TaskManager 执行。
  • 资源管理:与集群管理系统(如 YARN、Kubernetes)交互,申请或释放计算资源。
  • 故障恢复:通过 checkpoint 和恢复机制处理任务失败,确保任务能够从上一次的状态恢复。
  • 监控与管理:管理集群中任务的执行状态,收集并展示指标。
TaskManager

TaskManager 是 Flink 集群中的工作节点,负责实际执行任务。每个 TaskManager 会执行多个任务槽(Task Slot),其具体职责包括:

  • 任务执行:TaskManager 负责接收和执行由 JobManager 分配的任务。
  • 资源隔离:每个 Task Slot 是 Flink 用于隔离任务资源的基本单元,Task Slot 可以防止任务之间的资源竞争,提供 CPU 和内存的隔离。
  • 状态管理:TaskManager 负责管理任务的状态和中间结果,将状态存储在内存或外部存储系统中。
  • 数据传输:TaskManager 之间进行网络通信,传输流数据。

2. DataStream API 和 DataSet API

  • DataStream API:Flink 提供了一个流式数据处理的编程接口,用于处理无限的数据流(无界流)。它的核心概念包括:
    • Transformation:Flink 提供了丰富的数据转换操作(如 map、filter、reduce、window 等),这些操作可以直接应用于流数据。
    • Window:Flink 支持对流数据进行窗口操作,将数据按时间、数量、会话等进行分割并聚合。
    • Time Semantics:Flink 支持多种时间语义,包括处理时间(Processing Time)和事件时间(Event Time)。
  • DataSet API:用于批处理数据集,操作方式类似于批处理框架如 Hadoop。适用于有限的数据集。

3. 执行引擎

Flink 的执行引擎将用户编写的代码转换为底层的并行计算任务并运行,这个过程分为多个步骤:

StreamGraph 和 JobGraph
  • StreamGraph:这是用户定义的作业的初步表示,用户的 DataStream 程序会被翻译成一个有向无环图 (DAG),其中节点表示操作符,边表示数据流动。
  • JobGraph:StreamGraph 会进一步被优化为 JobGraph。JobGraph 是物理执行的高层次逻辑表示,反映了任务之间的依赖关系。
TaskGraph
  • TaskGraph 是 Flink 作业的物理执行图。JobGraph 被细化为 TaskGraph,它包含具体的物理执行任务,并包含每个任务的并行度信息。
  • Execution Graph:当 Flink 开始执行时,TaskGraph 会被转换成 Execution Graph,反映了任务如何在集群上并行执行。
Task Slot
  • 每个 TaskManager 包含多个 Task Slot。每个 Task Slot 负责执行一个或多个并行任务,并且能够隔离不同任务的资源使用。通过这种方式,Flink 可以在单个节点上运行多个任务而不互相干扰。

4. 状态管理

Flink 处理的数据流可能会依赖于中间状态(例如计算窗口聚合、join 或带状态的函数),这时状态管理显得尤为重要。

Operator State 和 Keyed State
  • Operator State:每个操作符(Operator)可以维护自己的状态。Operator State 在整个流作业中共享,不区分具体的数据键。
  • Keyed State:Keyed State 是基于键的状态,每个键(key)都有其自己的状态。Keyed State 常用于基于 key 的分布式状态处理。
State Backend

Flink 提供了多种方式来存储作业的状态:

  • MemoryStateBackend:状态存储在内存中,适合小状态的应用。
  • FsStateBackend:将状态存储在文件系统中,通常用于批处理作业。
  • RocksDBStateBackend:将状态存储在外部持久化存储(如 RocksDB 中),适合状态较大的应用场景。
Checkpointing 和 Savepoints
  • Checkpointing:Flink 支持周期性 checkpoint,它可以捕获整个作业的状态,用于恢复任务失败。checkpoint 是增量式的,系统只保存状态的变化部分。
  • Savepoint:Savepoint 是手动触发的状态保存点,常用于作业的维护和升级。Savepoint 通常用于持久化状态并在以后恢复。

5. 事件时间与窗口

事件时间

事件时间是 Flink 支持的时间语义,它根据事件发生的时间戳来处理数据。这与其他流处理框架通常使用的处理时间(即系统接收到数据的时间)不同。

  • Watermark:在乱序数据的处理过程中,Flink 使用 Watermark 来标记系统已经看到的最晚事件时间。Watermark 可以帮助 Flink 决定何时可以关闭窗口并输出结果。
窗口操作

Flink 提供了灵活的窗口操作,允许将数据流分成多个窗口:

  • Time Window:按时间段划分数据流。
  • Count Window:按数据数量划分窗口。
  • Session Window:基于用户活动的间隔自动生成窗口。
  • Global Window:包含整个数据流,不会根据时间或数量进行划分。

6. 容错性

Checkpoint

Flink 的 checkpoint 机制用于在作业执行期间周期性地保存作业状态。一旦任务失败,系统可以从最近的 checkpoint 重新启动任务,确保数据的完整性。

  • 增量检查点:Flink 支持增量式 checkpoint,仅存储自上次 checkpoint 以来的变化部分,节省存储和计算资源。
Exactly Once 语义

Flink 提供了严格的"精确一次"处理语义,确保在发生故障时,数据不会被重复处理或丢失。Flink 使用的 checkpoint 和两阶段提交协议(Two-Phase Commit Protocol)来实现精确一次的消息传递。

7. 资源管理

Flink 可以与各种资源管理系统集成,动态管理和调度计算资源:

  • YARN:与 Hadoop YARN 集成,动态分配集群资源。
  • Kubernetes:Flink 可以在 Kubernetes 集群中运行,通过容器化环境进行自动扩展。
  • Standalone 模式:在独立服务器上运行,资源管理由用户手动配置。

8. Flink 的流处理与批处理统一模型

Flink 统一了流处理和批处理的执行模型。Flink 将批处理视为有界的流处理,而流处理则是无界的数据处理。通过这种统一模型,Flink 能够有效地处理不同类型的数据任务。这一特性使得 Flink 能够在一个引擎中高效地处理实时数据流和批处理作业,同时确保任务的语义一致性。

每个部分相互协作,保证了 Flink 作为一个分布式计算平台,能够高效地处理海量数据,并提供高可用性和容错性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值