抽象流程
抽象级别:不管是什么模式,大体上就是上面这个流程。
- 任务提交给分发器
- 分发器把任务提交给JobManager上的JobMaster组件
- JobMaster收到任务之后,就会想JobManager上的ResourceManager去请求Slot
- JobManager上的ResourceManager会提供给JobMaster相应的Slot
- JobMaster把任务调度到具体的TaskManager上去执行
- 等待执行结果
Standalone模式下的任务提交
- 客户端把任务提交给Dispacher(分发器)
- 分发器启动JobMaster,并把任务提交给JobMaster
- JobMaster收到任务之后,会想JobManager的ResourceManager组件去请求资源
- JObManager的ResourceManager收到请求后,直接向TaskManager去请求相应的资源
- TaskManager会向JobMaster提供相应的资源
- JobMaster把任务调度到TaskManager去执行
Yarn-session模式下的任务提交
Session模式提交分2步:
- 启动yarn-session
- yarn-session.sh脚本向Yarn的ResourceManager请求Container(容器),这个容器就是ApplicationMaster
- Yarn的ResourceManager收到请求后,就会启动JobManager,这个AppMaster就包含了Flink的JobManager(主节点)
- JobManager这个角色,就会启动Dispacher和ResourceManager,这里没有TaskManager和JobMaster
- 提交任务
- 客户端提交任务到Dispacher(分发器)
- 分发器就会启动JobMaster
- JobMaster会向JobManager的ResourceManager请求资源
- JobManager的ResourceManager没有资源,因此向Yarn的ResourceManager申请资源
- Yarn的ResourceManager收到请求后,就会启动Container(容器),这个容器就包含了TaskManager角色
- TaskManager启动后就会向JobManager的ResourceManager注册资源,同时也会向JobMaster提供资源
- JobMaster收到资源后,就会把任务调度给Container去执行,因为Container包含了TaskManager,因此任务会顺利执行完成
- 任务执行完之后,Container就会销毁(TaskManager就被销毁了),集群又恢复到第一步的状态
per-job模式下的任务提交
和per-job模式下的任务提交类似。
- 客户端提交任务到Yarn集群
- Yarn的ResourceManager收到任务请求后,会启动Container(容器),也就是AppMaster。这里包含了JobManager(Flink的主角色,这个JobManager没有Dispacher,但是有JobMaster和ResourceManager)
- JobManager里的JobMaster向JobManager里的ResourceManager请求资源
- JobManager的ResourceManager没有资源,因此会向Yarn去申请资源
- Yarn的ResourceManager收到请求后,会额外启动Container(容器),启动的容器就会带有TaskManager(Flink的从角色)
- Container会反向注册到AppMaster,告诉AppMaster自己的资源情况
- Container会把资源提供给AppMaster(JobManager的JobMaster)
- JobMaster会把任务具体地调度给Container去执行(TaskManager)
- 任务执行完之后,Container(TaskManager)会被AppMaster销毁,最终,AppMaster也会销毁。