Flink部署集群整体架构源码分析

 更新时间:2022年12月01日 11:35:00   作者:xiangel  
这篇文章主要为大家介绍了Flink部署集群及整体架构示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概览

本篇我们来了解Flink的部署模式和Flink集群的整体架构

部署模式

Flink支持如下三种运行模式

运行模式描述
Application ModeFlink Cluster只执行提交的整个job,然后退出;main方法在cluster中执行;支持yarn和k8s;官方建议yarn和k8s上的运行方式
pre-job modeFlink Cluster只执行提交的整个job,然后退出;main方法在client中执行;支持yarn;官方建议yarn上运行方式, 该模式在Flink 1.15中被废弃了,建议用application mode
session mode支持在一个Flink Cluster中提交多个任务;main方法在client中执行;支持yarn和k8s

Flink的部署步骤分为如下2步:

  • 部署启动一个Flink Cluster,负责接收job提交请求和管理job信息;
  • 向Flink Cluster提交job; 根据Flink Cluster可以运行的任务的数量(1个或多个)和提交job请求的地点(远端或Cluster端)的不同,从而有了不同的运行模式。由于pre-job模式已经被废弃了,下面我们主要来学习下Application mode和session mode

Application mode

Application mode是Flink Cluster运行1个job,提交任务的地点为Cluster端。其提交方式如下

./bin/flink run-application -t yarn-application ./examples/streaming/TopSpeedWindowing.jar

其处理流程为,客户端提交部署请求,服务端启动Flink Cluster, 服务端运行Flink Application提交Job到Cluster。下面我们分析下具体实现细节。

客户端提交请求

通过flink命令提交请求,其运行的类为CliFrontend。为支持部署到不同的资源管理平台,所以有和对应资源管理系统交互的类,具体如下:

  • CliFrontend:flink命令对应的类,发起提交请求,后面session mode的提交Flink Application也是由该类负责
  • ClusterClientFactory:集群客户端工厂类,负责生成不同资源管理平台的客户端
  • ClusterDescriptor:负责和对应的资源管理平台交互,申请资源和提交请求
  • ClusterEntrypoint:在资源管理平台运行的类,启动Flink Cluster。 针对不同资源管理平台的对应实现类如下:
接口类yarnkubernates
ClusterClientFactoryYarnClusterClientFactoryKubernetesClusterClientFactory
ClusterDescriptorYarnClusterDescriptorKubernetesClusterDescriptor
ClusterEntrypointYarnApplicationClusterEntryPointKubernetesApplicationClusterEntrypoint

服务端启动&提交Application

服务端启动对应的ClusterEntrypoint,其中会启动一个REST Server来接受提交Flink Application,另外有个Dispatcher负责作业的调度,其他部分后面我们分析运行流程时再展开介绍。作业的提交请求是在Dispatcher中的DispatcherBootstrap属性实例化的时候触发。 Flink Application运行时,是在StreamExecutionEnvironment.execute()方法来触发实际提交,提交相关的调用链如下:

这几个都是接口类,在Application模式下对应的实现类如下

接口类实现类
PipelineExecutorServiceLoaderEmbeddedExecutorServiceLoader
PipelineExecutorFactoryEmbeddedExecutorFactory
PipelineExecutorEmbeddedExecutor

session mode

session mode是一个Flink Cluster可以来运行多个Flink job。那这里的提交会分为2个步骤

// 提交启动session cluster
// yarn session
./bin/yarn-session.sh --detached
// kubernates session
./bin/kubernetes-session.sh -Dkubernetes.cluster-id=my-first-flink-cluster
// 提交job
./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
  • 通过yarn-session.sh (或kubernates-session.sh) 来提交部署Flink Cluster,这块和前面application mode类似,以yarn模式为例,底层也是调用了YarnClusterDescriptor来提交相应的请求,提交到服务器的是YarnSessionClusterEntrypoint类。
  • 提交Job,这块是在client端来单独提交的,直接提交信息到服务器的REST Server,根据提交的目标资源管理系统的不同,使用了不同的实现类
接口类实现类yarn实现类kubernates
PipelineExecutorServiceLoaderDefaultExecutorServiceLoaderDefaultExecutorServiceLoader
PipelineExecutorFactoryYarnSessionClusterExecutorFactoryYarnSessionClusterExecutorFactory
PipelineExecutorYarnSessionClusterExecutorKubernetesSessionClusterExecutor

Cluster架构

Flink是一个Master/Worker的架构,Master节点负责整个任务的管理,Worker节点负责执行对应的任务。其整体结构如下:

* JobManager: Master节点的统称,目前版本没有该类,其中有几个重点的服务,如上图所示,目前的代码中对应的组合了这些服务的类为:

Dispatcher

ResourceManager

Component。

* Dispatcher: Job调度器,负责接收Job的提交,保存Job和管理JobMaster来执行作业。前面我们提到的提交作业到Cluster,实际上是提交给了Dispatcher的。

* ResourceManager: 负责和不同的资源调度系统交互,管理资源申请。

* WebMonitorEndpoint: 负责web界面的Rest请求处理

* JobMaster: 负责运行单个JobGraph,包括TaskManager的管理,任务的调度等。

* TaskManager: 负责任务的执行,也没有TaskManager的类,对应的类为TaskExecutor,来执行多个Task

说明:JobManager可能是原来的JobMaster,具体通过Dispatcher.java的如下代码可以看出,重点在对其具体结构的理解,这个变化的逻辑我们就不考究了。

 private JobManagerRunner createJobMasterRunner(JobGraph jobGraph) throws Exception

Cluster的启动流程

上面介绍了Cluster的整体架构,接下来我们看看Cluster的启动流程。以Application mode部署到Yarn为例(其他模式的启动类似,只是启动的主类不同)。该方式下的主类为:YarnApplicationClusterEntryPoint,其内部调用了ClusterEntrypoint的方法,最终是通过ClusterEntrypoint类的runCluster()方法来创建DispatcherResourceManagerComponent对象。

DispatcherResourceManagerComponent

接下来我们看看DispatcherResourceManagerComponent中的具体属性信息

    @Nonnull private final DispatcherRunner dispatcherRunner;
    @Nonnull private final ResourceManagerService resourceManagerService;
    @Nonnull private final RestService webMonitorEndpoint;
    @Nonnull private final LeaderRetrievalService dispatcherLeaderRetrievalService;
    @Nonnull private final LeaderRetrievalService resourceManagerRetrievalService;

Runner代码

这里我们并没有看到Dispatcher,而是一个类似名字的DispatcherRunner.DispatcherRunner是来管理Dispatcher如何运行的。类似ResourceManagerService是来管理ResourceManager的生命周期的。

HA代码框架

另外由于这些服务都有双机容错机制(HA), 所以这里在看相关代码的时候会产生一定的干扰,本篇的最后我们来介绍下这块HA的相关的机制,这样对大家来梳理相关的流程会更清晰。 Leader的选举,是通过LeaderElectionService(选举服务,实现类为DefaultLeaderElectionService)和LeaderContender(竞选者)共同来完成的。具体过程为LeaderElectionService.start(LeaderContender),启动选举服务,传入LeaderContender信息,等选举成功后,会回调LeaderContender的grantLeadership()方法,Flink中相关的服务都实现了LeaderContender接口。所以理清这个逻辑后,我们在看到相关服务的start()方法中只调用了leaderElectionService.start方法时也不用懵了,直接看该服务的grantLeadership方法来梳理逻辑。 LeaderElectionDriver:进行Leader的选举和保存Leader的信息,具体的实现有ZooKeeperLeaderElectionDriver和KubernetesLeaderElectionDriver

那如何获取Leader的地址呢,也提供了相应的接口LeaderRetrievalService和LeaderRetrievalLister,启动一个对Leader地址的监听,leader有变化时会得到通知。

总结

本篇我们了解了Flink的部署模式,按Job提交方式和一个集群可同时运行任务的数量的不同,分为ApplicationMode和SessionMode2种模式。接着介绍了Cluster的整体架构和启动流程,主要包括Dispatcher、ResourceManager和WebMonitorEndpoint。最后介绍了HA处理的整体框架,便于大家更好的梳理核心流程。

以上就是Flink部署集群整体架构源码分析的详细内容,更多关于Flink部署集群架构的资料请关注脚本之家其它相关文章!

相关文章

  • java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例

    java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案

    这篇文章主要介绍了java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例,
    2021-02-02
  • Request对象如何获取请求头数据

    Request对象如何获取请求头数据

    这篇文章主要介绍了Request对象如何获取请求头数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 基于SpringBoot整合SSMP案例(开启日志与分页查询条件查询功能实现)

    基于SpringBoot整合SSMP案例(开启日志与分页查询条件查询功能实现)

    这篇文章主要介绍了基于SpringBoot整合SSMP案例(开启日志与分页查询条件查询功能实现),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋参考下吧
    2023-11-11
  • Java string不可变原理实例解析

    Java string不可变原理实例解析

    这篇文章主要介绍了Java string不可变原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 分析Java非阻塞算法Lock-Free的实现

    分析Java非阻塞算法Lock-Free的实现

    非阻塞算法一般会使用CAS来协调线程的操作。虽然非阻塞算法有诸多优点,但是在实现上要比基于锁的算法更加繁琐和负责。本文将会介绍两个是用非阻塞算法实现的数据结构。
    2021-06-06
  • 详解Swagger接口文档和常用注解的使用

    详解Swagger接口文档和常用注解的使用

    Swagger是一款遵循 Restful 风格的接口文档开发神器,支持基于 API 自动生成接口文档。本文将为大家讲讲Swagger接口文档和常用注解的使用方法,需要的可以参考一下
    2022-08-08
  • JAVA实现图书管理系统项目

    JAVA实现图书管理系统项目

    相信每一个学生学编程的时候,应该都会写一个小项目——图书管理系统。为什么这么说呢?我认为一个学校的氛围很大一部分可以从图书馆的氛围看出来,而图书管理系统这个不大不小的项目,接触的多,也比较熟悉,不会有陌生感,能够练手,又有些难度,所以我的小项目也来了
    2021-10-10
  • 详解Maven私服Nexus的安装与使用

    详解Maven私服Nexus的安装与使用

    这篇文章主要介绍了详解Maven私服Nexus的安装与使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java中的CAS无锁机制实现原理详解

    Java中的CAS无锁机制实现原理详解

    这篇文章主要介绍了Java中的CAS无锁机制实现原理详解,无锁机制,是乐观锁的一种实现,并发情况下保证对共享变量值更改的原子性,CAS是Java中Unsafe类里面的方法,底层通过调用C语言接口,再通过cup硬件指令保证原子性,需要的朋友可以参考下
    2024-01-01
  • java实现递归菜单树

    java实现递归菜单树

    这篇文章主要为大家详细介绍了java实现递归菜单树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08

最新评论