听说你熟悉Flink-On-Yarn的部署模式?

简介: 5万人关注的大数据成神之路,不来了解一下吗?5万人关注的大数据成神之路,真的不来了解一下吗?5万人关注的大数据成神之路,确定真的不来了解一下吗?欢迎您关注《大数据成神之路》前言Flink提供了两种在yarn上运行的模式,分别为Session-Cluster和Per-Job-Cluster模式,本文分析两种模式及启动流程。

5万人关注的大数据成神之路,不来了解一下吗?
5万人关注的大数据成神之路,真的不来了解一下吗?
5万人关注的大数据成神之路,确定真的不来了解一下吗?

欢迎您关注《大数据成神之路》
  1. 前言

Flink提供了两种在yarn上运行的模式,分别为Session-Cluster和Per-Job-Cluster模式,本文分析两种模式及启动流程。

下图展示了Flink-On-Yarn模式下涉及到的相关类图结构

image

  1. Session-Cluster模式

Session-Cluster模式需要先启动集群,然后再提交作业,接着会向yarn申请一块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到yarn中的其中一个作业执行完成后,释放了资源,下个作业才会正常提交。所有作业共享Dispatcher和ResourceManager;共享资源;适合规模小执行时间短的作业。

image

2.1. 启动集群
运行bin/yarn-session.sh即可默认启动包含一个TaskManager(内存大小为1024MB,包含一个Slot)、一个JobMaster(内存大小为1024MB),当然可以通过指定参数控制集群的资源,如-n指定TaskManager个数,-s指定每个TaskManager中Slot的个数;其他配置项,可参考

下面以bin/yarn-session.sh为例,分析Session-Cluster启动流程。

2.2. 流程分析
下面分为本地和远程分析启动流程,其中本地表示在客户端的启动流程,远端则表示通过Yarn拉起Container的流程;

2.2.1 本地流程
Session启动入口为FlinkYarnSessionCli#main

根据传入的参数确定集群的资源信息(如多少个TaskManager,Slot等)

部署集群AbstractYarnClusterDescriptor#deploySessionCluster -> AbstractYarnClusterDescriptor#deployInternal

根据flink-conf的HA配置创建对应的服务(如StandaloneHaServices、ZooKeeperHaServices等)

创建基于Netty的RestClient;

创建/rest_server_lock、/dispatcher_lock节点(以ZK为例)

启动监听节点的变化(主备切换)

初始化文件系统(HDFS)

将log4j、logback、flink-conf.yaml、jar包上传至HDFS

构造AppMaster的Container(确定Container进程的入口类YarnSessionClusterEntrypoint),构造相应的Env

YarnClient向Yarn提交Container申请

跟踪ApplicationReport状态(确定是否启动成功,可能会由于资源不够,一直等待)

进行资源校验(如内存大小、vcore大小、队列)

通过YarnClient创建Application

再次校验资源

AbstractYarnClusterDescriptor#startAppMaster启动AppMaster

启动成功后将对应的ip和port写入flinkConfiguration中

创建与将集群交互的ClusterClient

通过ClusterClient获取到appId信息并写入本地临时文件

经过上述步骤,整个客户端的启动流程就结束了,下面分析yarn拉起Session集群的流程,入口类在申请Container时指定为YarnSessionClusterEntrypoint。

2.2.2 远端流程
远端宿主在Container中的集群入口为YarnSessionClusterEntrypoint#main

ClusterEntrypoint #runClusterEntrypoint -> ClusterEntrypoint#startCluster启动集群

经过上述步骤就完成了集群的启动;

创建/dispatcher_lock节点,/resource_manager_lock节点

创建DispatcherGateway、ResourceManagerGateway的Retriever(用于创建RpcGateway)

创建DispatcherGateway的WebMonitorEndpoint并启动

创建JobManager的指标组

创建ResourceManager、Dispatcher并启动进行ZK选举

返回SessionDispatcherResourceManagerComponent

初始化文件系统

初始化各种Service(如:

创建RpcService(AkkaRpcService)、创建HAService、创建并启动BlobServer、创建HeartbeatServices、创建指标服务并启动、创建本地存储ExecutionGraph的Store)

创建DispatcherResourceManagerComponentFactory(SessionDispatcherResourceManagerComponentFactory),用于创建DispatcherResourceManagerComponent(用于启动Dispatcher、ResourceManager、WebMonitorEndpoint)

通过DispatcherResourceManagerComponentFactory创建DispatcherResourceManagerComponent

2.3. 启动任务
当启动集群后,即可使用./flink run -c mainClass /path/to/user/jar向集群提交任务。

2.4 流程分析
同样,下面分为本地和远程分析启动流程,其中本地表示在客户端提交任务流程,远端则表示集群收到任务后的处理流程。

2.4.1 本地流程
程序入口为CliFrontend#main

解析处理参数

根据用户jar、main、程序参数、savepoint信息生成PackagedProgram

获取session集群信息

执行用户程序

获取任务的JobGraph

通过RestClusterClient#submitJob提交任务

创建本地临时文件存储JobGraph

通过RestClusterClient向集群的rest接口提交任务

处理请求响应结果

设置ClassLoader

设置Context

执行用户程序main方法(当执行用户业务逻辑代码时,会解析出StreamGraph然后通过ClusterClient#run来提交任务),其流程如下:

重置Context

重置ClassLoader

经过上述步骤,客户端提交任务过程就完成了,主要就是通过RestClusterClient将用户程序的JobGraph通过Rest接口提交至集群中。

2.4.2 远端流程
远端响应任务提交请求的是RestServerEndpoint,其包含了多个Handler,其中JobSubmitHandler用来处理任务提交的请求;

处理请求入口:

JobSubmitHandler#handleRequest

进行相关校验

从文件中读取出JobGraph

通过BlobClient将jar及JobGraph文件上传至BlobServer中

通过Dispatcher#submitJob提交JobGraph

通过Dispatcher#runJob运行任务

启动JobMaster

将任务运行状态信息写入ZK(/${AppID}/running_job_registry/${jobId})

启动JobMaster的Endpoint

开始调度任务JobMaster#startJobExecution

创建JobManagerRunner(处理leader选举)

创建JobMaster(实际执行任务入口,包含在JobManagerRunner)

启动JobManagerRunner(会进行leader选举,ZK目录为leader/${jobId}/job_manager_lock)

当为主时会调用JobManagerRunner#grantLeadership方法

接下来就进行任务具体调度(构造ExecutionGraph、申请Slot等)流程,本篇文章不再展开介绍。

  1. Per-Job-Cluster模式

一个任务会对应一个Job,每提交一个作业会根据自身的情况,都会单独向yarn申请资源,直到作业执行完成,一个作业的失败与否并不会影响下一个作业的正常提交和运行。独享Dispatcher和ResourceManager,按需接受资源申请;适合规模大长时间运行的作业。

image

3.1 启动任务
启动Per-Job-Cluster任务,可通过./bin/flink run -m yarn-cluster -d -c mainClass /path/to/user/jar命令使用分离模式启动一个集群,即单任务单集群;

3.2. 流程分析

与Session-Cluster类似,我们对Per-Job-Cluster模式也分为本地和远端。

3.2.1 本地流程

与Session-Cluster模式类似,入口也为CliFrontend#main

解析处理参数

根据用户jar、main、程序参数、savepoint信息生成PackagedProgram

根据PackagedProgram创建JobGraph(对于非分离模式还是和Session模式一样,模式Session-Cluster)

获取集群资源信息

部署集群YarnClusterDesriptor#deployJobCluster -> AbstractYarnClusterDescriptor#deployInternal;

后面流程与Session-Cluster类似,值得注意的是在AbstractYarnClusterDescriptor#startAppMaster中与Session-Cluster有一个显著不同的就是其会将任务的JobGraph上传至Hdfs供后续服务端使用

经过上述步骤,客户端提交任务过程就完成了,主要涉及到文件(JobGraph和jar包)的上传。

3.2.2 远端流程
远端宿主在Container中的集群入口为YarnJobClusterEntrypoint#main

ClusterEntrypoint#runClusterEntrypoint -> ClusterEntrypoint#startCluster启动集群

创建JobDispatcherResourceManagerComponentFactory(用于创建JobDispatcherResourceManagerComponent)

创建ResourceManager(YarnResourceManager)、Dispatcher(MiniDispatcher),其中在创建MiniDispatcher时会从之前的JobGraph文件中读取出JobGraph,并启动进行ZK选举

当为主时会调用Dispatcher#grantLeadership方法

Dispatcher#runJob开始运行任务(创建JobManagerRunner并启动进行ZK选举),后续流程与Session-Cluster相同,不再赘述

Dispatcher#recoverJobs恢复任务,获取JobGraph

Dispatcher#tryAcceptLeadershipAndRunJobs确认获取主并开始运行任务

Flink提供在Yarn上两种运行模式:Session-Cluster和Per-Job-Cluster,其中Session-Cluster的资源在启动集群时就定义完成,后续所有作业的提交都共享该资源,作业可能会互相影响,因此比较适合小规模短时间运行的作业,对于Per-Job-Cluster而言,所有作业的提交都是单独的集群,作业之间的运行不受影响(可能会共享CPU计算资源),因此比较适合大规模长时间运行的作业。

5万人关注的大数据成神之路,不来了解一下吗?
5万人关注的大数据成神之路,真的不来了解一下吗?
5万人关注的大数据成神之路,确定真的不来了解一下吗?

欢迎您关注《大数据成神之路》
相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
SQL 关系型数据库 MySQL
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
Apache Flink CDC 3.4.0 版本正式发布!经过4个月的开发,此版本强化了对高频表结构变更的支持,新增 batch 执行模式和 Apache Iceberg Sink 连接器,可将数据库数据全增量实时写入 Iceberg 数据湖。51位贡献者完成了259次代码提交,优化了 MySQL、MongoDB 等连接器,并修复多个缺陷。未来 3.5 版本将聚焦脏数据处理、数据限流等能力及 AI 生态对接。欢迎下载体验并提出反馈!
2105 1
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
|
分布式计算 资源调度 大数据
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(一)
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(一)
524 0
|
分布式计算 资源调度 大数据
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(二)
大数据-110 Flink 安装部署 下载解压配置 Standalone模式启动 打包依赖(二)
407 0
|
关系型数据库 MySQL 数据库
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
TIS 是一款基于Web-UI的开源大数据集成工具,通过与人大金仓Kingbase的深度整合,提供高效、灵活的实时数据集成方案。它支持增量数据监听和实时写入,兼容MySQL、PostgreSQL和Oracle模式,无需编写复杂脚本,操作简单直观,特别适合非专业开发人员使用。TIS率先实现了Kingbase CDC连接器的整合,成为业界首个开箱即用的Kingbase CDC数据同步解决方案,助力企业数字化转型。
3323 5
基于Flink CDC 开发,支持Web-UI的实时KingBase 连接器,三大模式无缝切换,效率翻倍!
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
930 9
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
542 3
|
关系型数据库 MySQL 数据处理
实时计算 Flink版产品使用问题之mini-cluster模式下,怎么指定checkpoint的时间间隔
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
资源调度 分布式计算 大数据
大数据-111 Flink 安装部署 YARN部署模式 FlinkYARN模式申请资源、提交任务
大数据-111 Flink 安装部署 YARN部署模式 FlinkYARN模式申请资源、提交任务
642 0
|
分布式计算 资源调度 Hadoop
在YARN集群上运行部署MapReduce分布式计算框架
主要介绍了如何在YARN集群上配置和运行MapReduce分布式计算框架,包括准备数据、运行MapReduce任务、查看任务日志,并启动HistoryServer服务以便于日志查看。
406 0
|
机器学习/深度学习 人工智能 运维
美团 Flink 大作业部署问题之Flink在生态技术演进上有什么主要方向
美团 Flink 大作业部署问题之Flink在生态技术演进上有什么主要方向