Flink三种运行模式分析

Flink运行模式有三种:session、per-job、Application。
其中三者核心区别点:1. 集群的生命周期和资源管理隔离程度 2. main()方法的执行是在客户端还是集群。
首先了解下Flink集群架构:


image.png

Session

Session生命周期,预先启动一个长期运行的集群,该集群可以接收多个作业的提交,即使所有作业完成后,集群仍然继续运行直到手动停止。
资源隔离,所有作业共享集群,如果TM崩溃,此TM运行的所有作业都将失败,如果JM挂了,所有作业都会受影响,需要重启所有作业。优点:由于资源预先分配好,节省大量的申请资源及启动TM的时间。
main()方法在client执行,熟悉Flink编程模型的应该知道,main()方法执行过程中需要拉去任务的jar包及依赖jar包,同时需要做StreamGraph到JobGraph的转换,会给客户端带来重大的压力。如果多个作业同时提交客户端将遇到单点瓶颈。

per-job

生命周期,随着任务的提交而创建,随着任务结束而销毁。为每个提交的作业启动一个集群,该集群仅可用于改作业,一旦作业完成集群将会释放。作业之间互不影响。
资源隔离,隔离性最好,每个作业一个集群。
main()方法在client侧执行。

application

生命周期,无需先启动Flink集群,随着作业提交而启动。
资源隔离,多个job组成一个application运行在同一个集群上,比如如果main()方法有多个execute(),这些作业将视为同一个应用,运行在同一集群中。而对于per-job模式,会启动多个集群。
main()方法在集群上执行而不是客户端上,客户端只会把job的jar包等上传到HDFS,由JM进程的集群入口类(ApplicationClusterEntryPoint)执行main()方法生成JobGraph等

三种不同的运行模式,结合资源管理的不同实现形成了Flink不同集群启动的入口类。具体参考以下类图:


image.png

可以参照类图,从不同的类出发探索集群启动的核心源码,详细了解集群启动的奥秘,关于StandaloneSessionClusterEntrypoint模式的集群启动源码分析可以参考:https://www.jianshu.com/p/2ebe954456e4

你可能感兴趣的:(Flink三种运行模式分析)