flink架构 详解

ops/2024/11/17 19:39:13/

Flink是一个分布式系统,需要有效分配和管理计算资源才能执行流应用程序。Flink同时提供了支撑流计算和批计算的接口,以下是对Flink架构的详细解析:

一、架构分层

Flink的架构体系基本上可以分为三层,由上往下依次是:

  1. API&Libraries层:作为分布式数据处理框架,Flink在此基础之上抽象出不同的应用类型的组件库,如基于流处理的CEP(复杂事件处理库)、SQL&Table库,和基于批处理的FlinkML(机器学习库)、Gelly(图处理库)等。API层包括构建流计算应用的DataStream API和批计算应用的DataSet API,两者都提供给用户丰富的数据处理高级API,例如Map、FlatMap操作等,同时也提供比较低级的Process Function API,用户可以直接操作状态和时间等底层数据。
  2. Runtime核心层:该层主要负责对上层不同接口提供基础服务,也是Flink分布式计算框架的核心实现层,支持分布式Stream作业的执行、JobGraph到ExecutionGraph的映射转换、任务调度等。它将DataSteam(流作业)和DataSet(批作业)转成统一的可执行的Task Operator,达到在流式引擎下同时处理批量计算和流式计算的目的。
  3. 物理部署层:该层主要涉及Flink的部署模式。目前Flink支持多种部署模式,包括本地、集群(Standalone/YARN)、云(GCE/EC2)、Kubenetes。Flink能够支持不同平台的部署,用户可以根据需要选择对应的部署模式。

二、组件构成

Flink整个系统主要由两个组件组成,分别为JobManager和TaskManager,Flink架构也遵循Master-Slave架构设计原则,JobManager为Master节点,TaskManager为Worker(Slave)节点。

  1. Client

    • 作用:Client 是 Flink 应用程序提交的入口点。它负责将用户编写的 Flink 应用程序打包成 JAR 文件,并提交给 JobManager。
    • 功能:Client 负责将用户编写的 Flink 程序转换成一个 JobGraph(作业图),然后将这个 JobGraph 提交给 JobManager。Client 还可以用来监控作业的状态和获取日志信息。
  2. JobManager

    • 作用:JobManager 是 Flink 集群的主控节点,负责协调和管理整个集群的资源分配、作业调度和容错。
    • 功能
      • ResourceManager:负责Flink集群中的资源提供、回收、分配。它管理task slots,这是Flink集群中资源调度的单位。Flink为不同的环境和资源提供者(例如YARN、Kubernetes和standalone部署)实现了对应的ResourceManager。
      • JobMaster:负责管理和协调单个作业的执行。每个作业都有一个对应的 JobMaster。
      • Dispatcher:提供了一个REST接口,用来提交Flink应用程序执行,并为每个提交的作业启动一个新的JobMaster。同时,它也会运行Flink WebUI,用来提供作业执行信息。
      • Checkpoint Coordinator:负责触发和协调 Checkpoint 操作,以保证状态的一致性和容错性。
  3. TaskManager

    • 作用:TaskManager 是 Flink 集群的工作节点,负责执行具体的任务。
    • 功能
      • Slot:TaskManager 中的资源单位,每个 Slot 可以运行一个 Task(子任务)。TaskManager 可以有多个 Slot,每个 Slot 可以看作是一个独立的 JVM 线程。
      • Task:实际执行计算逻辑的任务。一个 Task 可以是 Source、Transformation 或 Sink。
      • Network Stack:负责 Task 之间的数据交换和通信。
      • Buffer Management:管理内存中的缓冲区,用于暂存数据和优化数据传输。

此外,Client不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)。

三、运行原理

  1. 当用户提交作业的时候,提交脚本会首先启动一个Client进程负责作业的编译与提交。Client首先将用户编写的流式处理代码编译为一个JobGraph,还会进行一些检查或优化等工作,例如判断哪些Operator可以Chain到同一个Task中(合并)。
  2. 然后,Client将产生的JobGraph提交到集群中执行。此时有两种情况:一种是类似于Standalone这种Session模式,AM(Flink Master白框中的组件)会预先启动,此时Client直接与Dispatcher建立连接并提交作业即可;另一种是Per-Job模式,AM不会预先启动,此时Client将首先向资源管理系统(如Yarn、K8S)申请资源来启动AM,然后再向AM中的Dispatcher提交作业。
  3. 作业到Dispatcher后,Dispatcher会首先启动一个JobManager组件,然后JobManager会向ResourceManager申请资源来启动作业中具体的任务。
  4. ResourceManager选择到空闲的Slot之后,就会通知相应的TaskManager“将该Slot分配给JobManager XX”,TaskManager进行相应的记录后,会向JobManager进行注册。JobManager收到TaskManager注册上来的Slot后,就可以实际提交Task了。
  5. TaskManager收到JobManager提交的Task之后,会启动一个新的线程来执行该Task。Task启动后就会开始进行预先指定的计算,并通过数据Shuffle模块互相交换数据。
总结
  1. 作业提交

    • 用户通过 Client 提交 Flink 作业。
    • Client 将作业转换成 JobGraph 并提交给 JobManager。
  2. 资源分配

    • JobManager 的 ResourceManager 负责分配 TaskManager 的 Slot。
    • JobManager 的 Dispatcher 接收 JobGraph 并创建 JobMaster。
  3. 作业调度

    • JobMaster 将 JobGraph 转换成 ExecutionGraph,并分配给 TaskManager 的 Slot。
    • TaskManager 执行具体的 Task。
  4. 数据流处理

    • Task 之间通过网络栈进行数据交换。
    • Task 执行具体的计算逻辑,如 Map、Filter、Reduce 等。
  5. 容错和 Checkpoint

    • JobManager 的 Checkpoint Coordinator 触发 Checkpoint 操作。
    • TaskManager 执行 Checkpoint,保存状态到外部存储。
    • 如果发生故障,Flink 可以从最近的 Checkpoint 恢复作业状态,继续处理数据。

四、核心特性

  1. 流处理和批处理统一:同时支持高吞吐、低延迟、高性能。Flink 提供了统一的 API 来处理流数据和批数据,使得开发者可以使用相同的代码来处理不同类型的数据。
  2. 状态管理:Flink 提供了强大的状态管理功能,支持多种状态后端(如内存、RocksDB 等),并提供了高效的 Checkpoint 机制来保证状态的一致性和容错性。
  3. Exactly-Once 语义:Flink 支持 Exactly-Once 语义,确保每条记录只被处理一次,即使在故障恢复的情况下也是如此。
  4. 支持事件时间(Event Time)概念:Flink 支持基于事件时间的时间窗口处理,确保在乱序事件的情况下也能得到正确的处理结果。
  5. 支持有状态计算
  6. 支持高度灵活的窗口(Window)操作
  7. 基于轻量级分布式快照(Snapshot)实现的容错
  8. 基于JVM实现独立的内存管理
  9. Save Points(保存点)
  10. 多层级API
  11. 灵活的部署:Flink 可以部署在多种环境中,包括 YARN、Kubernetes、Mesos 以及 standalone 模式。

五、部署模式

Flink支持多种部署模式,包括:

  1. 本地模式
  2. 集群模式:可以是Standalone模式或基于YARN的模式。
  3. 云模式:如GCE、EC2等。
  4. Kubernetes模式

其中,Session模式是先有Flink集群后再提交任务,任务在客户端提交运行,提交的多个作业共享Flink集群。Per-Job模式和Application模式都是提交Flink任务后创建集群。Per-Job模式通过客户端提交Flink任务,每个Flink任务对应一个Flink集群,每个任务有很好的资源隔离性。Application模式是在JobManager上执行main方法,为每个Flink的Application创建一个Flink集群,如果该Application有多个任务,这些Flink任务共享一个集群。

六、Flink 的应用场景

  • 实时数据分析:如日志分析、用户行为分析、实时报表等。
  • 事件驱动应用:如实时推荐系统、欺诈检测、实时报警系统等。
  • ETL 流程:数据抽取、转换和加载,支持从多种数据源读取数据并写入多种数据目标。
  • 流处理:如流式 ETL、流式机器学习、流式图处理等。

总的来说,Flink架构是一个高度模块化、可扩展和灵活的分布式处理引擎,能够处理无边界和有边界的数据流,满足各种实时和批处理需求。


http://www.ppmy.cn/ops/134512.html

相关文章

《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 我们希望你创建一个定制的服务机器人。 您可以想出任何您希望机器人执行的任务,例如,一个可以解决简单的数学问题的机器人0 一个机器人&#xff0c…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结: 2、choices**choices 在 Django 中有以下几种形式:**(1) **简单的列表或元组形式**(2) **字典映射形式**(3&#…

当使用key-value方式进行参数传递时,若key对应的是一个对象或数组结构,如何利用API Post工具进行模拟操作。

1. 后端服务代码如下 RequestMapping("/handle11")public Person handle11(Person person){System.out.println(person);return person;} 2. 后端入参结构 person是一个对象,对象结构如下: public class Person {private String username …

TypeORM在Node.js中的高级应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 TypeORM在Node.js中的高级应用 TypeORM在Node.js中的高级应用 TypeORM在Node.js中的高级应用 引言 TypeORM 基本概念 1. 实体&am…

【SQL】双层嵌套< exists not exists >

EXISTS 运算符 EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。 语法 SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);实例1 查找总访问量…

SQL集合运算

集合论是SQL语言的根基。 1 集合运算 注意事项: 1)SQL能操作具有重复行的集合,可以通过可选项ALL来支持。 如果直接使用UNION或INTERSECT,结果里不会出现重复的行。如果想在结果里留下重复行,可以加上可选项ALL。写…

推荐15个2024最新精选wordpress模板

以下是推荐的15个2024年最新精选WordPress模板,轻量级且SEO优化良好,适合需要高性能网站的用户。中文wordpress模板适合搭建企业官网使用。英文wordpress模板,适合B2C网站搭建,功能强大且兼容性好,是许多专业外贸网站的…

鸿蒙5.0版开发:使用HiLog打印日志(ArkTS)

在HarmonyOS 5.0中,HiLog是系统提供的一个日志系统,它允许应用和服务按照指定的级别、标识和格式字符串输出日志内容,帮助开发者了解应用的运行状态,更好地调试程序。本文将详细介绍如何在ArkTS中使用HiLog打印日志,并…