一.会话模式(Session Mode)
需要先启动集群,保持一个会话,在会话中通过客户端提交作业,集群在启动时所有的资源都已经确定,所有提交的作业会竞争集群中的资源。
优点:只需要一个集群,作业结束释放资源,集群正常运行。 缺点:资源共享,资源若是不够提交新作业会失败;如果TaskManager其中一个作业故障导致宕机,所有作业都会受影响。
二.单作业模式(Per-Job Mode)
会话模式资源共享可能会导致问题,为了隔离资源,可以考虑为每个提交作业启动集群。严格一对一,集群只为这个作业而生。
客户端运行应用程序,启动集群,作业提交给TaskManager,进而分发给TM执行,作业完成后,集群关闭,资源释放。 每个作业都有自己的JobManager管理,占用独享资源,不会影响其他作业。不过得借助一些资源管理框架来启动,例如YARN,Kubernetes。
三.应用模式(Application Mode)
前两种模式,应用代码都在客户端上执行,然后由客户端提交给JobManager,需要占用大量网络带宽,加重客户端所在节点的资源消耗。 解决办法:直接把应用提交到JobManager上运行,需要为每一个提交的应用单独启动一个JobManager,也就是创建一个集群,执行结束后JM关闭。
总结: 会话模式下集群的生命周期独立于集群上运行的任何作业的生命周期,并且所有作业资源共享。 单作业模式为每个提交的作业创建一个集群,带来资源隔离。 应用模式为每个应用程序创建一个会话集群,在JobManager上直接调用应用程序的main()方法。