Flink执行流程与源码分析(面试必问,建议收藏)

本文详细介绍了Flink的架构组件,包括JobManager、TaskManager、ResourceManager和Dispatcher的角色与职责。JobManager负责作业执行的协调,TaskManager执行任务,ResourceManager管理资源分配,Dispatcher接收并处理应用提交。在YARN环境下,Flink任务提交涉及JobClient、YARNResourceManager、ApplicationMaster和TaskManager的交互。此外,文章还深入解析了JobGraph、ExecutionGraph的生成过程以及Task的执行流程。

 

Flink主要组件

 

作业管理器(JobManager)

(1) 控制一个应用程序执行的主进程,也就是说,每个应用程序 都会被一个不同的Jobmanager所控制执行

(2) Jobmanager会先接收到要执行的应用程序,这个应用程序会包括:作业图( Job Graph)、逻辑数据流图( ogical dataflow graph)和打包了所有的类、库和其它资源的JAR包。

(3) Jobmanager会把 Jobgraph转换成一个物理层面的 数据流图,这个图被叫做 “执行图”(Executiongraph),包含了所有可以并发执行的任务。Job Manager会向资源管理器( Resourcemanager)请求执行任务必要的资源,也就是 任务管理器(Taskmanager)上的插槽slot。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的 Taskmanager上。而在运行过程中Jobmanagera会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

任务管理器(Taskmanager)

(1) Flink中的工作进程。通常在 Flink中会有多个 Taskmanageria运行, 每个 Taskmanageri都包含了一定数量的插槽( slots)。插槽的数量限制了Taskmanageri能够执行的任务数量。

(2) 启动之后,  Taskmanager会向资源管理器注册它的插槽;收到资源管理器的指令后,  Taskmanageri就会将一个或者多个插槽提供给Jobmanageri调用。Jobmanager就可以向插槽分配任务( tasks)来执行了。

(3) 在执行过程中, 一个 Taskmanagera可以跟其它运行同一应用程序的Taskmanager交换数据。

资源管理器(Resource Manager)

(1) 主要负责管理任务管理器( Task Manager)的 插槽(slot)Taskmanger插槽是 Flink中定义的处理资源单元。

(2) Flink 为不同的环境和资源管理工具提供了不同资源管理器,比如YARNMesos、K8s,以及 standalone部署。

(3) 当 Jobmanager申请插槽资源时,  Resourcemanager会将有空闲插槽的Taskmanager?分配给Jobmanager。如果 Resourcemanagery没有足够的插槽来满足 Jobmanager的请求, 它还可以向资源提供平台发起会话,以提供启动 Taskmanager进程的容器。

分发器(Dispatcher)

(1) 可以跨作业运行,它为应用提交提供了REST接口。

(2)当一个应用被提交执行时,分发器就会启动并将应用移交给Jobmanage

(3) Dispatcher他会启动一个 WebUi,用来方便地 展示和监控作业执行的信息。

任务提交流程

  1. 提交应用

  2. 启动并提交应用

  3. 请求slots

  4. 任务启动

  5. 注册slots

  6. 发出提供slot的指令

  7. 提供slots

  8. 提交要在slots中执行的任务

  9. 交换数据

任务提交流程(YARN)

a. Flink任务提交后,Client向HDFS上传Flink的Jar包和配置

b. 随后向 Yarn ResourceManager提交任务ResourceManager分配 Container资源并通知对应的NodeManager启动

c. ApplicationMaster,ApplicationMaster 启动后加载Flink的Jar包和配置构建环境 

d. 然后启动JobManager , 之后ApplicationMaster 向ResourceManager 申请资源启动TaskManager

e. ResourceManager 分配 Container 资源后 , 由ApplicationMaster通知资源所在节点的NodeManager启动TaskManager

f. NodeManager 加载 Flink 的 Jar 包和配置构建环境并启动 TaskManager

g. TaskManager 启动后向  JobManager 发送心跳包,并等待 JobManager 向其分配任务。

源码分析--集群启动 JobManager 启动分析

JobManager 的内部包含非常重要的三大组件

  • WebMonitorEndpoint

  • ResourceManager

  • Dispatcher

入口,启动主类:StandaloneSessionClusterEntrypoint

// 入 口
StandaloneSessionClusterEntrypoint.main() ClusterEntrypoint.runClusterEntrypoint(entrypoint);
clusterEntrypoint.startCluster(); 
runCluster(configuration, pluginManager);

// 第一步:初始化各种服务
 /**
  * 初始化了 主节点对外提供服务的时候所需要的 三大核心组件启动时所需要的基础服务
  *  初始化服务,如 JobManager 的 Akka RPC 服务,HA 服务,心跳检查服务,metric service
  *  这些服务都是 Master 节点要使用到的一些服务
  *  1、commonRpcService:  基于 Akka 的 RpcService 实现。RPC 服务启动 Akka 参与者来接收从 RpcGateway 调用 RPC
  *  2、haServices:    提供对高可用性所需的所有服务的访问注册,分布式计数器和领导人选举
  *  3、blobServer:    负责侦听传入的请求生成线程来处理这些请求。它还负责创建要存储的目录结构 blob 或临时缓存它们
  *  4、heartbeatServices:  提供心跳所需的所有服务。这包括创建心跳接收器和心跳发送者。
  *  5、metricRegistry:   跟踪所有已注册的 Metric,它作为连接 MetricGroup 和 MetricReporter
  *  6、archivedExecutionGraphStore:   存储执行图ExecutionGraph的可序列化形式。
*/
initializeServices(configuration, pluginManager);

// 创建 DispatcherResourceManagerComponentFactory, 初始化各种组件的
工厂实例
// 其实内部包含了三个重要的成员变量:
// 创建 ResourceManager 的工厂实例
// 创建 Dispatcher 的工厂实例
// 创建 WebMonitorEndpoint 的工厂实例
createDispatcherResourceManagerComponentFactory(configuration);

// 创建 集群运行需要的一些组件:Dispatcher, ResourceManager 等
// 创 建 ResourceManager
// 创 建 Dispatcher
// 创 建 WebMonitorEndpoint
clusterComponent = dispatcherResourceManagerComponentFactory.create(...)

1. initializeServices():初始化各种服务

// 初 始 化 和 启 动 AkkaRpcService, 内 部 其 实 包 装 了 一 个 ActorSystem commonRpcService = AkkaRpcServiceUtils.createRemoteRpcService(...)

// 初始化一个负责 IO 的线程池
ioExecutor = Executors.newFixedThreadPool(...)
// 初始化 HA 服务组件,负责 HA 服务的是:ZooKeeperHaServices haServices = createHaServices(configuration, ioExecutor);

// 初始化 BlobServer 服务端
blobServer = new BlobServer(configuration, haServices.createBlobStore()); blobServer.start();

// 初始化心跳服务组件, heartbeatServices = HeartbeatServices heartbeatServices = createHeartbeatServices(configuration);

// 初始化一个用来存储 ExecutionGraph 的 Store, 实现是:
FileArchivedExecutionGraphStore
archivedExecutionGraphStore = createSerializableExecutionGraphStore(...)

2. createDispatcherResourceManagerComponentFactory(configuration)初始化了多组件的工厂实例

1、DispatcherRunnerFactory,默认实现:DefaultDispatcherRunnerFactory 

2、ResourceManagerFactory,默认实现:StandaloneResourceManagerFactory 

3、RestEndpointFactory,默认实现:SessionRestEndpointFactory

clusterComponent = dispatcherResourceManagerComponentFactory
    .create(configuration, ioExecutor, commonRpcService, haServices,
     blobServer, heartbeatServices, metricRegistry,
     archivedExecutionGraphStore,
     new RpcMetricQueryServiceRetriever(metricRegistry.getMetricQueryServiceRpcService()),
     this);

3. 创建 WebMonitorEndpoint

/*************************************************
  *  创建 WebMonitorEndpoint 实例, 在 Standalone 模式下:DispatcherRestEndpoint
  *  1、restEndpointFactory = SessionRestEndpointFactory
  *  2、webMonitorEndpoint = DispatcherRestEndpoint
  *  3、highAvailabilityServices.getClusterRestEndpointLeaderElectionService() = ZooKeeperLeaderElectionService
  *  当前这个 DispatcherRestEndpoint 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值