前言写这种文章的初衷是在开发过程中不知该如何选择,对各种模式也不是很了解。现在花点时间找资料,研究比较,所以发表这篇文章。本文从了解flink组件开始,然后以简单模式Local和Standlone正式进入正题。本文主要关注Yarn模式中的三种模式,当然还有Kubernetes模式(本文不细说)。组件在了解提交模式之前,首先要了解Flink组件与组件之间的协作关系。资源管理器(ResourceManager)(1)主要负责管理任务管理器TaskManager的槽位。(2)当jobmanagerJM申请slot资源时,RM会将有空闲slots的TM分配给JM。如果RM没有足够的插槽来满足JM的要求。(3)也可以向资源提供平台发起会话,提供启动TM进程的容器。作业管理器(JobManager)(1)控制一个应用程序执行的主进程,即每个应用程序都会被不同的JM控制。(2)JM首先会收到要执行的应用程序,其中会包括:作业图(JobGraph)、逻辑数据流图(logicaldataflowgraph)和封装所有类、库等资源的JAR包。(3)JM会将Jobgraph转化为物理数据流图,称为“Executiongraph”,包含所有可以并发执行的任务。JobManager会向资源管理器(Resourcemanager)请求执行任务所需要的资源,即任务管理器(Taskmanager)上的slot。一旦它获得了足够的资源,它就会将执行图分发给实际运行它们的TM。在运行过程中,JM将负责所有需要中央协调的操作,例如检查点的协调。Taskmanager(1)Flink中的Worker进程。Flink中通常运行着多个TM,每个TM包含一定数量的slot。槽的数量限制了TM可以执行的任务数量。(2)启动后,TM会向资源管理器注册自己的slots;TM收到资源管理器的指令后,会提供一个或多个slot给JM调用。然后TM可以将任务分配给槽执行。(3)在执行过程中,一个TM可以与运行相同应用程序的其他TM交换数据。Dispatcher(1)可以跨作业运行,它为应用程序提交提供了一个REST接口。(2)当提交执行申请时,分销商将启动并将申请交给庄信万丰。(3)Dispatcher会启动一个WebUi来方便的显示和监控作业执行信息。本地模式JobManager和TaskManager共享一个JVM,只需要jdk支持,单节点运行,主要用于调试。Standlone模式Standlone是Fl??ink自带的分布式集群。不依赖其他资源调度框架,yarn等,Master的作用是JobManager。扮演Slave/Worker的角色就是TaskManager的配置和启动(1)conf目录下有两个文件:masters和workers指定地址。(2)需要配置conf/flink-conf.yaml的自配置。(3)每台机器的分布。(4)启动集群bin/start-cluster.sh(5)以flinkrunYarn方式提交任务首先了解提交流程(1)提交App前,将FlinkJar包和配置上传到HDFS,以便JobManager和TaskManager可以共享HDFS数据。(2)客户端将Job提交给ResourceManager。ResourceManager收到请求后,首先分配容器资源,然后通知NodeManager启动ApplicationMaster。(3)ApplicationMaster会加载HDFS的配置,启动对应的JobManager,然后JobManager会分析当前的jobgraph,转换成执行图(包括所有可以并发执行的任务),从而知道具体的资源当前需要。(4)接下来JobManager会向ResourceManager申请资源。ResourceManager收到请求后会继续分配容器资源,然后通知ApplicationMaster启动更多的TaskManager(先分配容器资源,再启动TaskManager)。Container在启动TaskManager时也会从HDFS加载数据。(5)TaskManager启动后,会向JobManager发送心跳包。JobManager将任务分配给TaskManager。SessionModeSession模式是预先初始化一个集群,然后向集群提交应用。所有应用程序都在同一个集群中执行并共享资源。这里只有一个JobManager。提交到这个集群的作业可以直接运行。如图所示,Session模式共享Dispatcher和ResourceManager,作业共享集群资源。多个作业之间的会话不是隔离的。如果一个TaskManager挂了,那么它承载的所有作业也会失败。同样,启动的Job任务越多,JobManager的负载就越大。因此Session模式适用于生命周期短、资源消耗低的场景。提交./bin/flinkrun-tyarn-session\-Dyarn.application.id=application_XXXX_YY\./examples/streaming/TopSpeedWindowing.jarPer-JobClusterMode在Per-Job模式下,每个提交到YARN的作业都会有一个独立的Flink集群有自己的JobManager和TaskManager。也就是说:一个作业一个集群,作业之间相互隔离。Per-Job方式提交作业的启动延迟可能会很高,因为不需要共享集群,所以在PipelineExecutor中执行作业提交时,创建一个集群,将JobGraph和需要的文件提交到Yarn集群进行一次一系列的初始化动作此时会花费一些时间。提交任务时,会将本地flink的所有jar包上传到hdfs上对应的临时目录,这样也会带来很大的网络开销。优点是作业之间的资源完全隔离。一个作业的TaskManager失效不会影响其他作业的运行。JobManager的负载也是分布式的,不存在单点问题。当作业完成运行时,与其关联的集群将被销毁并释放资源。因此,Per-Job模式一般用于部署那些长时间运行的作业。提交/bin/flinkrun-tyarn-per-job--detached./examples/streaming/TopSpeedWindowing.jar「其他操作」#Listrunningjobonthecluster./bin/flinklist-tyarn-per-job-Dyarn.application.id=application_XXXX_YY#Cancelrunningjob...为实现这一点,它将为每个作业创建一个集群,但应用程序的main()将在JobManager中执行。应用程序模式为每个提交的应用程序创建一个集群,可以将其视为在特定应用程序的作业之间共享的会话集群,并在应用程序完成时终止。在这个架构中,Application模式提供了不同应用程序之间的资源隔离和负载均衡,以确保main()方法在JobManager中执行,可以节省所需的CPU周期。另一个好处是,由于每个应用程序有一个JobManager,网络负载可以更均匀地分布。提交./bin/flinkrun-application-tyarn-application./examples/streaming/TopSpeedWindowing.jar「其他操作」#Listrunningjobonthecluster./bin/flinklist-tyarn-application-Dyarn.application.id=application_XXXX_YY#Cancelrunningjob./bin/flinkcancel-tyarn-application-Dyarn.application.id=application_XXXX_YY
