Flink 学习 | 青训营笔记

141 阅读4分钟

Flink 学习 | 青训营笔记

1 Flink 概念

1.1 Flink 是什么

Apache Flink is a frameworkand and distributed processing engine for stateful computations over unbounded and bounded data streams.

在 Flink 的世界观中,一切都是流组成的。一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有节数据集(批式数据)也是一种数据流。

1.2 批量计算 vs 流式计算

流式计算,是对数据流进行处理,是实时计算。批量计算则是先统一收集数据,存储到数据库中,然后对数据进行批量处理的数据计算方式。

流式计算的特点:实时计算、快速、低延迟、无限流、动态、无边界。

1.3 三种流式计算引擎对比

StormSpark StreamingFlink
Stream ModelNativemini-batchNative
一致性保证At Least/Most OnceExactly-OnceExactly-Once
延迟低(毫秒)高(秒)低(毫秒)
吞吐
StatefulNoYesYes
SQLNoYesYes

2 Flink 架构

2.1 Flink 分层架构

底层:状态存储层,负责存储算子的状态信息。

中间层:Runtime 层,提供了统一的DAG,用来描述数据处理的 Pipeline。不管是流还是批,都会转化为 DAG 图。Scheduler 再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据。

顶层:SDK 层,SQL/Table, DataStream, pyFlink。

2.2 Flink 运行组件

  • 作业管理器(JobManager)

每个应用程序都会被一个不同的 JobManager 所控制执行。JobManager 会把 JobGraph 转换成物理层面的 ExecutionGraph。JobManager 会向 ResourceManager 请求执行任务必要的资源,也就是 TaskManager 上的 slot。一旦它获取到了足够的资源,就会将 ExecutionGraph 分发到真正运行它们的TaskManager上。

  • 任务管理器(TaskManager)

Flink 中的工作进程。每一个TaskManager 都包含了一定数量 slots 。slots 的数量限制了 TaskManager 能够执行的任务数量。启动之后,TaskManager 会向 ResourceManager 注册它的 slots ;收到 ResourceManager 的指令后,TaskManager 就会将一个或者多个 slots 提供给 JobManager 调用。JobManager就可以向 slots 分配 tasks 来执行。

  • 资源管理器(ResourceManager)

ResourceManager 主要负责管理 TaskManager 的 slots(Flink 中定义的处理资源单元)。当 JobManager 申请 slots 资源时,ResourceManager 会将有空闲 slots 的TaskManager 分配给 JobManager。如果 ResourceManager 没有足够的 slots 来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager 进程的容器。

  • 分发器(Dispatcher)

当一个应用被提交执行时,分发器就会启动并将应用移交给一个 JobManager。注意,Dispatcher 在架构中不是必需的。

2.3 任务提交流程

  1. 客户端向分发器提交应用;
  2. 分发器启动并向作业管理器提交应用;
  3. 作业管理器向资源管理器请求 slots;
  4. 资源管理器启动任务管理器;
  5. 任务管理器向资源管理器注册 slots;
  6. 资源管理器发出提供 slots 的指令;
  7. 任务管理器向作业管理器提供 slots;
  8. 作业管理器向任务管理器提交要在 slots 中执行的任务。

2.4 任务调度原理图

Flink_Program.png

3 Exactly Once 语义在 Flink 中的实现

3.1 一致性语义保证

  • At-most-once:每条数据消费至多一次,处理延迟低。

  • At-least-once:每条数据消费至少一次,一条数据可能存在重复消费。

  • Exactly-once:每条数据都被消费且仅被消费一次,仿佛故障从未发生。

3.2 Checkpoint

在流式计算中,会存在有状态的计算逻辑(算子)。比如,需要计算某个用户在网上的点击量,该用户在网站当前的总点击次数就是算子状态,对于新的输入数据,先判断是否是该用户的点击行为,如果是,则将保留的点击次数(状态)增加一,并将当前累加结果输出。

image.png

  • Checkpoint barrier 的下发
  • 算子状态制作和 barrier 传递
  • 多个上游的等待 barrier 对齐现象
  • Checkpoint 并不阻塞算子数据处
  • Checkpoint ACK 和制作完成

(有待研究......)

3.3 端到端 Exactly-Once 实现

  1. 协作者(JobManager)发起提交(Pre-commit);
  2. 各算子 Checkpoint 的制作;
  3. 提交阶段及 Checkpoint 的制作完成。

image.png

image.png

参考引用

【大数据专场 学习资料一】第四届字节跳动青训营 - 掘金 (juejin.cn)