亲宝软件园·资讯

展开

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

xiangel 人气:0

概览

本篇我们来了解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步:

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。为支持部署到不同的资源管理平台,所以有和对应资源管理系统交互的类,具体如下:

接口类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实现类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处理的整体框架,便于大家更好的梳理核心流程。

加载全部内容

相关教程
猜你喜欢
用户评论