标题: Flink实时数仓之任务部署模式
时间: 2021-07-24 09:10:16
标签: [Flink,实时数仓]
分类: 实时数仓
大家好,我是Lee,最近在研究Flink任务的远程提交,所以需要了解它能不能实现远程提交,怎么提交,有哪几种模式运行flink实时任务,今天给你们介绍一下。且看下文。
不同的模式,主要区别就在于集群的生命周期和任务的资源调度上。还有就是任务的main方法是在client上还是cluster上执行的。
1.local cluster
就是在你搭建的flink集群上执行flink run,没有指定-m(mode)参数,即为local模式,该模式方便调试,开发时使用方便,在flink web ui端可以查看到相应的任务。
2.application mode
应用的main方法执行在cluster端。
main方法执行在client的话,有一个坏处就是,启动时,需要从集群中下载所有的依赖到client端,抽出程序的执行图JobGraph,然后将依赖项和JobGraph发送到集群中其他机器,这样对client机器的网络带宽和cpu有很大的一个资源压力,在客户端被许多用户共享使用时,这个问题会更加明显。application mode的main方法执行在cluster端。就没有这个问题。
另外,application mode为每个提交的应用分别创建一个cluster,main()方法在Jobmanager端执行,为每一个应用创建一个cluster可以被看作是创建一个仅在特定程序的作业之间共享的会话集群,当应用结束后,即销毁cluster资源。
在这种架构模式下,拥有per-job模式的资源隔离优势。并且main()方法执行在jobmanager中,可以节约cpu和带宽。
相比于per-job模式,application mode模式允许提交的应用中包含多个作业,作业的执行顺序不受部署模式的影响,而是受调用的先后顺序,使用execute()是阻塞的,第一个启动的作业必须结束后才能启动第二个作业。executeAsync()是非阻塞的,这样第二个job可以在第一个job未执行完之前就启动起来。
而且,application mode允许一个应用多作业并行执行时,它是不支持高可用的,必须在单个应用单个作业时才是高可用的。
在application mode下,当一个应用中跑了多个作业(使用的是executeAsync()),你如果取消其中一个作业,其他的所有作业均会停止,并且jobmanager会关闭。
使用方法:
# 启动application mode任务
./bin/flink run-application -t yarn-application ./examples/streaming/TopSpeedWindowing.jar
# List running job on the cluster
./bin/flink list -t yarn-application -Dyarn.application.id=application_XXXX_YY
# Cancel running job
./bin/flink cancel -t yarn-application -Dyarn.application.id=application_XXXX_YY <jobId>
3.per-job
应用的main方法执行在client端。
利用现有的资源管理器,如yarn、kubernetes,为每个应用启动单独的集群。每个提交的应用,需要付出启动集群的代价。好处是,更好的保证了jobs之间资源不共享,这样的话,每个集群的生命周期跟单个任务绑定在一块,任务结束就释放了资源。比如某个应用出错了,影响到了taskmanager,导致TaskManager挂了,并不会影响其他任务的TaskManager。所以基于这些优点,生产上推荐这种模式。
使用方法:
# 启动任务
./bin/flink run -t yarn-per-job --detached ./examples/streaming/TopSpeedWindowing.jar
# List running job on the cluster
./bin/flink list -t yarn-per-job -Dyarn.application.id=application_XXXX_YY
# Cancel running job
./bin/flink cancel -t yarn-per-job -Dyarn.application.id=application_XXXX_YY <jobId>
4.session mode
应用的main方法执行在client端。
集群的生命周期是非独立的,包含了所有的running job,资源是共享的。
优点就是集群已经启动起来了,每个提交的任务不需要单独启动集群,使用现有的资源即可,缺点是如果某一个任务出错导致TaskManager挂了,那么其他所有的运行中的任务都会受到影响。
# 启动任务
./bin/flink run -t yarn-session \
-Dyarn.application.id=application_XXXX_YY \
./examples/streaming/TopSpeedWindowing.jar
综上所述,总结下来,application mode和per-job mode适合生产使用,因为资源隔离,互不影响是最关键的。
参考链接:https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/deployment/overview/
ok,完成
书山有路勤为径,学海无涯苦作舟。
欢迎关注微信公众号:【程序员写书】
喜欢宠物的朋友可以关注:【电巴克宠物Pets】
一起学习,一起进步。