一张图轻松掌握 Flink on YARN 基础架构与启动流程

2024-05-02 08:18

本文主要是介绍一张图轻松掌握 Flink on YARN 基础架构与启动流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=jpeg
杨弢(搏远),阿里巴巴计算平台事业部技术专家,Apache Hadoop Committer,目前专注于 YARN、Flink、YuniKorn 等开源项目的资源调度方向。

Flink 支持 Standalone 独立部署和 YARN、Kubernetes、Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛。Flink 社区将推出 Flink on YARN 应用解读系列文章,分为上、下两篇。本文基于 FLIP-6 重构后的资源调度模型将介绍 Flink on YARN 应用启动全流程,并进行详细步骤解析。

Flink on YARN 应用启动流程图

Flink on YARN 集群部署模式涉及 YARN 和 Flink 两大开源框架,应用启动流程的很多环节交织在一起,为了便于大家理解,在一张图上画出了 Flink on YARN 基础架构和应用启动全流程,并对关键角色和流程进行了介绍说明。整个启动流程被划分成客户端提交(流程标注为紫色)、Flink Cluster 启动和 Job 提交运行(流程标注为橙色)两个阶段分别阐述,由于分支和细节太多,本文会忽略掉一些,只介绍关键流程(基于 Flink 开源 1.9 版本源码整理)。

640?wx_fmt=png

客户端提交流程

1.执行命令:bin/flink run -d -m yarn-cluster ...或bin/yarn-session.sh ...来提交 per-job 运行模式或 session 运行模式的应用;

2.解析命令参数项并初始化,启动指定运行模式,如果是 per-job 运行模式将根据命令行参数指定的 Job 主类创建 job graph;

  • 如果可以从命令行参数(-yid <APPLICATION_ID>)或 YARN properties 临时文件(${java.io.tmpdir}/.yarn-properties-${user.name})中获取应用 ID,向指定的应用中提交 Job;

  • 否则当命令行参数中包含 -d(表示detached模式)和 -m yarn-cluster(表示指定 YARN 集群模式),启动 per-job 运行模式;

  • 否则当命令行参数项不包含 -yq(表示查询YARN集群可用资源)时,启动 session 运行模式;

3.获取 YARN 集群信息、新应用 ID 并启动运行前检查;

  • 通过 YarnClient 向 YARN ResourceManager (下文缩写为:YARN RM,YARN Master 节点,负责整个集群资源的管理和调度)请求创建一个新应用(YARN RM 收到创建应用请求后生成新应用 ID 和 container 申请的资源上限后返回),并且获取 YARN Slave 节点报告(YARN RM 返回全部 slave 节点的 ID、状态、rack、http 地址、总资源、已使用资源等信息);

  • 运行前检查:(1) 简单验证YARN集群能否访问;(2) 最大 node 资源能否满足 flink JobManager/TaskManager vcores 资源申请需求;(3) 指定 queue 是否存在(不存在也只是打印WARN信息,后续向YARN提交时排除异常并退出);(4)当预期应用申请的Container资源会超出YARN资源限制时抛出异常并退出;(5) 当预期应用申请不能被满足时(例如总资源超出YARN集群可用资源总量、Container申请资源超出NM可用资源最大值等)提供一些参考信息。

4.将应用配置(flink-conf.yaml、logback.xml、log4j.properties)和相关文件(flink jars、ship files、user jars、job graph等)上传至分布式存储(例如 HDFS)的应用暂存目录(/user/${user.name}/.flink/);

5.准备应用提交上下文(ApplicationSubmissionContext,包括应用的名称、类型、队列、标签等信息和应用 Master 的 container 的环境变量、classpath、资源大小等),注册处理部署失败的 shutdown hook(清理应用对应的 HDFS 目录),然后通过 YarnClient 向 YARN RM 提交应用;

6.循环等待直到应用状态为 RUNNING,包含两个阶段:

  • 循环等待应用提交成功(SUBMITTED):默认每隔 200ms 通过 YarnClient 获取应用报告,如果应用状态不是 NEW 和 NEW_SAVING 则认为提交成功并退出循环,每循环 10 次会将当前的应用状态输出至日志:"Application submission is not finished, submitted application <APPLICATION_ID> is still in <APP_STATE>",提交成功后输出日志:"Submitted application <APPLICATION_ID>"

  • 循环等待应用正常运行(RUNNING):每隔 250 ms 通过 YarnClient 获取应用报告,每轮循环也会将当前的应用状态输出至日志:"Deploying cluster, current state <APP_STATE>"。应用状态成功变为 RUNNING 后将输出日志"YARN application has been deployed successfully."并退出循环,如果等到的是非预期状态如 FAILED/FINISHED/KILLED,就会在输出 YARN 返回的诊断信息("The YARN application unexpectedly switched to state <APP_STATE> during deployment. Diagnostics from YARN: ...")之后抛出异常并退出。

Flink Cluster 启动流程

1.YARN RM 中的 ClientRMService(为普通用户提供的 RPC 服务组件,处理来自客户端的各种 RPC 请求,比如查询 YARN 集群信息,提交、终止应用等)接收到应用提交请求,简单校验后将请求转交给 RMAppManager(YARN RM 内部管理应用生命周期的组件);

2.RMAppManager 根据应用提交上下文内容创建初始状态为 NEW 的应用,将应用状态持久化到 RM 状态存储服务(例如 ZooKeeper 集群,RM 状态存储服务用来保证 RM 重启、HA 切换或发生故障后集群应用能够正常恢复,后续流程中的涉及状态存储时不再赘述),应用状态变为 NEW_SAVING;

3.应用状态存储完成后,应用状态变为 SUBMITTED;RMAppManager 开始向 ResourceScheduler(YARN RM 可拔插资源调度器,YARN 自带三种调度器 FifoScheduler/FairScheduler/CapacityScheduler,其中 CapacityScheduler 支持功能最多使用最广泛,FifoScheduler 功能最简单基本不可用,今年社区已明确不再继续支持 FairScheduler,建议已有用户迁至 CapacityScheduler)提交应用,如果无法正常提交(例如队列不存在、不是叶子队列、队列已停用、超出队列最大应用数限制等)则抛出拒绝该应用,应用状态先变为 FINAL_SAVING 触发应用状态存储流程并在完成后变为 FAILED;如果提交成功,应用状态变为 ACCEPTED;

4.开始创建应用运行实例(ApplicationAttempt,由于一次运行实例中最重要的组件是 ApplicationMaster,下文简称 AM,它的状态代表了 ApplicationAttempt 的当前状态,所以 ApplicationAttempt 实际也代表了AM),初始状态为 NEW;

5.初始化应用运行实例信息,并向 ApplicationMasterService(AM&RM 协议接口服务,处理来自 AM 的请求,主要包括注册和心跳)注册,应用实例状态变为 SUBMITTED;

6.RMAppManager 维护的应用实例开始初始化 AM 资源申请信息并重新校验队列,然后向 ResourceScheduler 申请 AM Container(Container 是 YARN 中资源的抽象,包含了内存、CPU 等多维度资源),应用实例状态变为 ACCEPTED;

7.ResourceScheduler 会根据优先级(队列/应用/请求每个维度都有优先级配置)从根队列开始层层递进,先后选择当前优先级最高的子队列、应用直至具体某个请求,然后结合集群资源分布等情况作出分配决策,AM Container 分配成功后,应用实例状态变为 ALLOCATED_SAVING,并触发应用实例状态存储流程,存储成功后应用实例状态变为 ALLOCATED;

8.RMAppManager 维护的应用实例开始通知 ApplicationMasterLauncher(AM 生命周期管理服务,负责启动或清理 AM container)启动 AM container,ApplicationMasterLauncher 与 YARN NodeManager(下文简称 YARN NM,与 YARN RM 保持通信,负责管理单个节点上的全部资源、Container 生命周期、附属服务等,监控节点健康状况和 Container 资源使用)建立通信并请求启动 AM container;

9.ContainerManager(YARN NM 核心组件,管理所有 Container 的生命周期)接收到 AM container 启动请求,YARN NM 开始校验 Container Token 及资源文件,创建应用实例和 Container 实例并存储至本地,结果返回后应用实例状态变为 LAUNCHED;

10.ResourceLocalizationService(资源本地化服务,负责 Container 所需资源的本地化。它能够按照描述从 HDFS 上下载 Container 所需的文件资源,并尽量将它们分摊到各个磁盘上以防止出现访问热点)初始化各种服务组件、创建工作目录、从 HDFS 下载运行所需的各种资源至 Container 工作目录(路径为: ${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/<APPLICATION_ID>/<CONTAINER_ID>);

11.ContainersLauncher(负责container的具体操作,包括启动、重启、恢复和清理等)将待运行 Container 所需的环境变量和运行命令写到 Container 工作目录下的 launch_container.sh 脚本中,然后运行该脚本启动 Container;

12.Container 进程加载并运行 ClusterEntrypoint(Flink JobManager 入口类,每种集群部署模式和应用运行模式都有相应的实现,例如在 YARN 集群部署模式下, per-job 应用运行模式实现类是 YarnJobClusterEntrypoint,session 应用运行模式实现类是 YarnSessionClusterEntrypoint),首先初始化相关运行环境:

  • 输出各软件版本及运行环境信息、命令行参数项、classpath 等信息;

  • 注册处理各种 SIGNAL 的 handler :记录到日志

  • 注册 JVM 关闭保障的 shutdown hook:避免 JVM 退出时被其他 shutdown  hook 阻塞打印 YARN 运行环境信息:用户名

  • 从运行目录中加载 flink conf

  • 初始化文件系统

  • 创建并启动各类内部服务(包括 RpcService、HAService、BlobServer、HeartbeatServices、MetricRegistry、ExecutionGraphStore 等)

  • 将 RPC address 和 port 更新到 flink conf 配置

13.启动 ResourceManager(Flink 资源管理核心组件,包含 YarnResourceManager 和 SlotManager 两个子组件,YarnResourceManager 负责外部资源管理,与 YARN RM 建立通信并保持心跳,申请或释放 TaskManager 资源,注销应用等;SlotManager 则负责内部资源管理,维护全部 Slot 信息和状态)及相关服务,创建异步 AMRMClient,开始注册 AM,注册成功后每隔一段时间(心跳间隔配置项:${yarn.heartbeat.interval},默认 5s)向 YARN RM 发送心跳来发送资源更新请求和接受资源变更结果。YARN RM 内部该应用和应用运行实例的状态都变为 RUNNING,并通知 AMLivelinessMonitor 服务监控 AM 是否存活状态,当心跳超过一定时间(默认 10 分钟)触发 AM failover 流程;

14.启动 Dispatcher(负责接收用户提供的作业,并且负责为这个新提交的作业拉起一个新的 JobManager)及相关服务(包括 REST endpoint 等),在 per-job 运行模式下,Dispatcher 将直接从 Container 工作目录加载 JobGraph 文件;在 session 运行模式下,Dispatcher 将在接收客户端提交的 Job(_通过 BlockServer 接收 job graph 文件)后再进行后续流程;

15.根据 JobGraph 启动 JobManager(负责作业调度、管理 Job 和 Task 的生命周期),构建 ExecutionGraph(JobGraph 的并行化版本,调度层最核心的数据结构);

16.JobManager 开始执行 ExecutionGraph,向 ResourceManager 申请资源;

17.ResourceManager 将资源请求加入等待请求队列,并通过心跳向 YARN RM 申请新的 Container 资源来启动 TaskManager 进程;后续流程如果有空闲 Slot 资源,SlotManager 将其分配给等待请求队列中匹配的请求,不用再通过 18. YarnResourceManager 申请新的 TaskManager;

18.YARN ApplicationMasterService 接收到资源请求后,解析出新的资源请求并更新应用请求信息;

19.YARN ResourceScheduler 成功为该应用分配资源后更新应用信息,ApplicationMasterService 接收到 Flink JobManager 的下一次心跳时返回新分配资源信息;

20.Flink ResourceManager 接收到新分配的 Container 资源后,准备好 TaskManager 启动上下文(ContainerLauncherContext,生成 TaskManager 配置并上传至分布式存储,配置其他依赖和环境变量等),然后向 YARN NM 申请启动 TaskManager 进程,YARN NM 启动 Container 的流程与 AM Container 启动流程基本类似,区别在于应用实例在 NM 上已存在并未 RUNNING 状态时则跳过应用实例初始化流程,这里不再赘述;

21.TaskManager 进程加载并运行 YarnTaskExecutorRunner(Flink TaskManager入口类),初始化流程完成后启动 TaskExecutor(负责执行Task相关操作);

22.TaskExecutor 启动后先向 ResourceManager 注册,成功后再向 SlotManager 汇报自己的 Slot 资源与状态;SlotManager 接收到 Slot 空闲资源后主动触发 Slot 分配,从等待请求队列中选出合适的资源请求后,向 TaskManager 请求该 Slot 资源

23.TaskManager 收到请求后检查该 Slot 是否可分配(不存在则返回异常信息)、 Job 是否已注册(没有则先注册再分配 Slot),检查通过后将 Slot 分配给 JobManager;

24.JobManager 检查 Slot 分配是否重复,通过后通知 Execution 执行部署 task 流程,向 TaskExecutor 提交 task;TaskExecutor 启动新的线程运行 Task。

参考资料

  • Flink Release-1.9 SourceCode

https://github.com/apache/flink/tree/release-1.9.0

  • Flink Release-1.9 Documents

https://ci.apache.org/projects/flink/flink-docs-release-1.9/
  • FLIP-6 - Flink Deployment and Process Model - Standalone, Yarn, Mesos, Kubernetes, etc.

https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=65147077
  • YARN 3.2 SourceCode

https://github.com/apache/hadoop/tree/branch-3.2
  • YARN 3.2.0 Documents

http://hadoop.apache.org/docs/r3.2.0/

上文对 Flink on YARN 应用启动全流程进行了梳理,下篇内容会根据社区大群反馈,解答客户端和 Flink Cluster 的常见问题,分享相关问题的排查思路,敬请期待!

640?wx_fmt=jpeg



11 月 28-30 日,Flink Forward Asia 2019 核心技术专场,届时 Apache Flink 核心贡献者们将与多位来自一线的业界资深专家带你全方位解锁 Flink 核心技术。购票及了解更多大会详情请扫描下下图二维码。

(11月28日下午,专场议程)

(11月29日上午,专场议程)

这篇关于一张图轻松掌握 Flink on YARN 基础架构与启动流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/953795

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud