Flink学习1——运行时架构(standalone模式)

本文详细介绍了Flink Standalone模式的运行时架构,包括JobManager和TaskManager的角色,以及它们如何通过Akka进行通信。JobManager相当于ResourceManager,负责任务管理和资源分配,而TaskManager作为NodeManager,执行具体任务并管理资源。TaskManager通过TaskSlots分配任务,每个Slot代表内存资源。数据交互如shuffle发生在TaskManager之间,且心跳机制确保集群稳定性。Flink的容错机制,如Checkpoint,由JobManager协调。

本篇主要讲述Flink Standalone模式下的运行时架构以及各个组件负责的功能,Flink的运行方式有很多,但都大同小异,本文基本可以满足对flink运行时架构的学习。

正文

Flink系统是主从模式,主要有两个组件构成分别是JobManager(Master)和TaskManager(Slave)。组件之间的通信借助于Akka。下图是standalone模式下的运行时架构图

  • JobManager相当于Yarn中的ResourceManager,TaskManager相当于Yarn中的NodeManager,TaskSlot相当于Yarn的Container,上图相当于spark的Standalone,需要Flink自己管理资源的情况。但是类别归类比,最终Flink的TaskManager是在yarn的container中启动的!因为container可以任务是一块独立的物理内存。在这个内存中可以启动一个JVM(可以是TM也可以是JM),如果是TM,那么TM中包含slot,slot也可以任务是一块内存区域,但是这个内存区域应该是JVM堆内存(也可能包含一部分堆外内存)。所以从都是内存区域的这个角度来讲,他们是类似的。

  • 客户端用于提交Flink程序,可以像Spark那样通过命令行提交,Flink还支持通过Web UI提交(这个功能在实际生产环境中一般会被禁用)。比如我们在服务器命令行提交flink程序,那这个提交程序的命令行就可以理解为是客户端。

  • 一个集群中只有一个活跃的JobManager,负责整个集群的任务管理和资源管理,TM心跳信息,状态统计信息等会发给JM。

  • TaskManager负责任务的具体执行和对应任务在每个节点上的资源申请和管理,程序运行时会在TM之间交换数据,比如有些算子的数据交换可能是跨slot,类似于Spark的shuffle操作。

  • 客户端提交的应用会给JobManager,JobManager会根据注册给自己的TaskManager的情况分配资源给应用程序。

  • TaskManager是一个JVM进程,它可能会在独立的线程上运行一个或者多个子任务,每个任务就是一个task,运行在TaskSlot里面。

  • 为了控制一个TaskManager能接受多少task,TaskManager通过task slot来控制(一个TaskManager至少有一个task slot)。上面说了,slot就类似于container,是对资源(内存、CPU)的封装。CPU是无法独享的,但是内存是独享的,也就是每个task都有自己的内存空间。

总结

1. 本文主要讲述了Flink不同组件在flink任务执行时的作用。

2. 上图中有画出TaskManager之间的数据交互。因为DataSource中的数据在分发给TaskSlot以后并不是一成不变的,类似Spark中的shuffle,有些算子中的数据会发往不同的slot(像keyBy算子),在发往不同slot的时候这不同的slot很可能就是跨TaskManager的,因此不同TM会存在大量的数据交互操作。

3. 上图还有画出不管是TaskManager还是JobManager都有一个Actor System。这便是负责通信的akka的重要组件。TaskManager需要定时发送心跳给JobManager告诉它自己还在正常工作。

4. 上图JobManager中有一个Checkpoint Coordinator,还有一条箭头指向TaskManager。首先Checkpoint是Flink用于容错定时触发的报错现在状态的轻量级快照,这个后面会讲。现在知道是JM通知TM触发的即可。

 

<think> 嗯,用户这次想了解Flink提交作业的模式。根据之前的对话历史,用户已经对Spark的作业提交方式有了较深的理解(spark-shell/spark-submit/spark-sql的区别),现在转向Flink框架的同类问题,说明ta可能在对比两个流处理引擎的架构差异。 用户提供的引用材料非常聚焦,主要来自Flink部署相关的技术文档(引用1-5)。这些材料清晰地展示了Flink的三种核心部署模式:会话模式、单作业模式、应用模式。有趣的是,用户特意标注了"并不是用户真正的需求",但根据上下文,这恰恰是ta当前需要的技术点——毕竟ta最后明确提问"Flink提交作业的模式有哪些"。 从引用内容看,有三个关键维度需要展开: 1. 模式区别:会话模式(静态集群共享)vs 单作业模式(每作业独立JobManager)vs 应用模式(整个应用共享集群) 2. 资源管理:尤其注意引用2和引用5强调的独立模式特殊性——TaskManager需手动启动,这与YARN/K8s的自动管理截然不同 3. 适用场景:引用4提到单作业模式"资源隔离好但网络负载高",这点对生产环境选型很重要 用户作为大数据工程师,可能正在为实计算平台选型,需要评估不同模式对资源利用率、隔离性和运维成本的影响。因此在回答中要突出对比维度(如资源分配粒度、JobManager生命周期),并补充实际命令示例(如引用1的yarn-cluster提交方式)。 特别要注意纠正一个潜在误区:引用3提到应用模式"启动JobMaster",严格来说JobMaster是运行组件,回答中需明确"为应用启动专属JobManager"的表述。此外,用户上次对Spark的"cluster"模式很关注(driver部署位置),类比到Flink应强调单作业模式的cluster级隔离。 </think>根据Flink架构设计,作业提交主要有三种核心模式,它们在**集群生命周期**、**资源分配粒度**和**适用场景**上存在显著差异: --- ### 1. **会话模式 (Session Mode)** - **核心特点**: - **共享集群**:预先启动长期运行的`JobManager`和`TaskManager`,所有作业共享资源[^2][^3] - **资源隔离弱**:作业间可能竞争资源(如CPU/内存) - **提交命令示例**: ```bash # 先启动集群 bin/start-cluster.sh # 提交作业到现有集群 bin/flink run -d -c com.example.Job app.jar ``` - **适用场景**: - 短测试或开发环境 - 作业执行间短且资源需求稳定[^4] --- ### 2. **单作业模式 (Per-Job Mode)** - **核心特点**: - **作业级隔离**:每个作业启动独立的`JobManager`和专属`TaskManager`[^1][^3] - **资源控制精细**:通过参数指定资源(如`-ytm`设置TaskManager内存) - **提交命令示例**: ```bash bin/flink run \ -m yarn-cluster \ # YARN集群模式 -yqu high_priority \ # 指定队列 -ynm "Flink-ETL-Job" \ # 作业名称 -ys 2 \ # 每个TM的Slot数 -ytm 4096 \ # TM内存4GB -yjm 2048 \ # JM内存2GB -c com.example.ETLJob app.jar ``` - **适用场景**: - 生产环境关键作业(如实ETL) - 需要严格资源隔离的场景[^1][^4] --- ### 3. **应用模式 (Application Mode)** - **核心特点**: - **应用级隔离**:整个应用(含多个作业)共享一个集群,但与其他应用隔离[^3][^4] - **资源复用**:应用内作业复用`JobManager` - **工作流程**: 1. 提交应用启动专属`JobManager` 2. `JobManager`按需申请`TaskManager`资源[^3] - **优势**: - 避免客户端资源消耗(JAR包在集群端加载) - 适合微服务化部署[^4] - **提交命令**: ```bash bin/flink run-application \ -t yarn-application \ # YARN应用模式 -c com.example.Main app.jar ``` --- ### 关键对比总结 | **模式** | 集群生命周期 | 资源隔离粒度 | 适用场景 | 运维复杂度 | |----------------|--------------|--------------|--------------------------|------------| | **会话模式** | 长期运行 | 作业间共享 | 开发测试、临查询 | 低 | | **单作业模式** | 按作业启停 | 作业级隔离 | 生产环境关键任务 | 中 | | **应用模式** | 按应用启停 | 应用级隔离 | 微服务架构、持续生成作业 | 高 | > **部署差异**: > - 独立部署(Standalone)**不支持单作业模式**,需手动预启TaskManager[^2][^5] > - YARN/Kubernetes支持所有三种模式,且能自动管理资源[^1][^4] --- ### 模式选择建议 1. **开发阶段** → 会话模式(快速迭代) 2. **生产单作业** → 单作业模式(强隔离) 3. **流处理应用** → 应用模式(资源复用) 例如电商场景: - 实风控(高优先级)用 **单作业模式** - 用户行为分析流水线用 **应用模式** - 临数据探查用 **会话模式** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值