基于Flink1.8版本,分析 On Yarn模式的任务提交过程:
- 明确提交模式:Job模式和Session模式
- 总览yarn提交流程(基于1.8)
- 分析启动命令,确定Main方法入口
- 结合关键类分析启动过程
- 总结Yarn启动流程 -
Yarn提交模式
- Job模式(小Session模式)
- Session模式
Job模式
每个Flink Job单独在yarn上声明一个Flink集群,即提交一次,生成一个Yarn-Session。
./bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar ...
Session模式
常驻Session,yarn集群中维护Flink Master,即一个yarn application master,运行多个job。
启动任务之前需要先启动一个一直运行的Flink集群:
1启动一个一直运行的flink集群
./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 -d
2 附着到一个已存在的flink yarn session
./bin/yarn-session.sh -id application_1463870264508_0029
总览yarn提交流程(基于1.8)
Flink架构
Flink基本组件
-
Dispatcher(Application Master)提供REST接口来接收client的application提交,它负责启动JM和提交application,同时运行Web UI。
-
ResourceManager:一般是Yarn,当TM有空闲的slot就会告诉JM,没有足够的slot也会启动新的TM。kill掉长时间空闲的TM。
-
JobManager :接受application,包含StreamGraph(DAG)、JobGraph(logical dataflow graph,已经进过优化,如task chain)和JAR,将JobGraph转化为ExecutionGraph(physical dataflow graph,并行化),包含可以并发执行的tasks。其他工作类似Spark driver,如向RM申请资源、schedule tasks、保存作业的元数据,如checkpoints。如今JM可分为JobMaster和ResourceManager(和下面的不同),分别负责任务和资源,在Session模式下启动多个job就会有多个JobMaster。
-
TaskManager:类似Spark的executor,会跑多个线程的task、数据缓存与交换。
Flink On Yarn
Flink1.7之后,新增了Dispatcher,在on yarn流程上略有却别
Without dispatcher
- 当开始一个新的Flink yarn 会话时,客户端首先检查所请求的资源(containers和内存)是否可用。如果资源够用,之后,上传一个jar包,包含Flink和HDFS的配置。
- 客户端向yarn resource manager发送请求,申请一个yarn container去启动ApplicationMaster。
- yarn resource manager会在nodemanager上分配一个container,去启动ApplicationMaster
- yarn nodemanager会将配置文件和jar包下载到对应的container中,进行container容器的初始化。
- 初始化完成后,ApplicationMaster构建完成。ApplicationMaster会为TaskManagers生成新的Flink配置文件(使得TaskManagers根据配置文件去连接到JobManager),配置文件会上传到HDFS。
- ApplicationMaster开始为该Flink应用的TaskManagers分配containers,这个过程会从HDFS上下载jar和配置文件(此处的配置文件是AM修改过的,包含了JobManager的一些信息,比如说JobManager的地址)
- 一旦上面的步骤完成,Flink已经建立并准备好接受jobs。
With dispatcher
Dispatcher组件负责接收作业提交,持久化它们,生成JobManagers以执行作业并在Master故障时恢复它们。此外,它知道Flink会话群集的状态。
引入Dispatcher是因为:
- 某些集群管理器需要一个集中的作业生成和监视实例
- 它包含独立JobManager的角色,等待提交作业
分析启动命令,确定Main方法入口
项目中使用 Job模式 提交命令,所以此处以Job模式为例介绍,提交命令如下:
./bin/flink run -m yarn-cluster -yn 2 -yjm 1024 -ytm 1024 ./examples/batch/WordCount.jar ...
分析flink.sh脚本(位于flink-dist模块),发现脚本最后的入口类:org.apache.flink.client.cli.CliFrontend,此类中的Main方法是所有提交操作的开始,在客户端Client执行。