本篇文章主要内容:

  1. Flink on Yarn的任务提交流程,以及任务运行过程中的交互;
  2. 根据Flink Application向Job Manager提交任务模式不同,阐述提交的三大模式:
    2.1 Session Mode
    2.2 Per-Job Mode
    2.3 Application Mode

1 任务提交流程

flink on yarn的任务提交流程 flink任务提交到yarn_应用程序


具体流程如下:

  1. 向hdfs上传Flink的jar包和配置,以便JobManager与TaskManager共享HDFS的数据;
  2. 向Yarn的ResourceManager提交Job;
  3. ResourceManager接收到请求后,先分配Container资源,然后通知NodeManager启动ApplicationMaster;ApplicationMaster会加载HDFS的配置,启动Flink对应的ResourceManager,JobManager,然后JobManager会分析当前的作业图(JobGraph),将它转化成物理层面的数据流图,也叫执行图(ExecutionGraph,包含了所有可以并发执行的任务),从而知道当前需要的具体资源;
  4. 接着,JobManager向ResourceManager申请资源,是先向flink的ResourceManager申请,然后flink的ResourceManager把此请求转发给Yarn的ResourceManager;
  5. Yarn的ResourceManager接收到请求后,继续分配Container资源,然后通知ApplicationMaster启动更多的TaskManager(先分配好Container资源,再通知ApplicationMaster启动TaskManager)。 Container在启动TaskManager时也会从HDFS加载Jar包和配置;
  6. 最后,TaskManager启动后,会向JobManager发送心跳包。JobManager向TaskManager发送任务;

2 三大提交模式

flink on yarn的任务提交流程 flink任务提交到yarn_大数据_02


三大模式的主要不同在于:

  1. 集群的生命周期和资源隔离级别;
  2. 应用程序的main()方法是在client还是在cluster发动;

2.1 Session Mode

多个作业向同一个Job Manager提交,这意味着JobManager有较大负载;
如果其中一个job行为异常或导致JobManager失败,那么在该TaskManager上运行的所有job都将收到故障的影响;
除了对导致故障的作业产生负面影响外,这还意味着在大规模恢复过程中,所有重启启动的任务同时访问文件系统导致它对其它服务不可用。
好处:不必为每个提交的作业支付启动开销的资源;
特点:应用程序的main()方法在客户端执行;

2.2 Per-Job Mode

每个提交的作业都会分配单独的一个Job Manager;
提供了更好的资源隔离,因为行为异常的作业只能关闭他自己的Task Manager;
特点:应用程序的main()方法在客户端执行;

2.3 Application Mode

Session Mode与Per-Job Mode他们的应用程序的main()方法都在客户端执行,具体执行的是:

  1. 本地下载应用程序的依赖项;
  2. 执行main()方法以提取在Flink runtime期间可以理解的JobGraph,并把JobGraph以及相关依赖发送到集群(也就是HDFS上);
    这使得客户端成为一个沉重的资源消耗者,因为他需要大量的网络带宽来下载依赖项并把二进制文件发送到集群,并且需要CPU周期性的执行main()方法;当大量用户共享一个客户端时这个问题就会更加明显。

基于此,Flink 1.11推出了第三种提交模式,也就是Application Mode,它为每个提交的应用创建一个集群。与其他两种模式不同的是,Application Mode应用程序的main()方法是在JobManager上执行。