在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。Flink为各种场景提供了不同的部署模式,主要有以下三种模式:
他们的主要区别在于:集群的生命周期以及资源的分配方式;以及应用的main方法到底是在哪里执行–客户端(client)还是JobManager。
会话模式其实最符合常规思维。我们需要先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业,如下图所示,集群启动时所有的资源就都已经确定,所以所有提交的作业会竞争集群中的资源。
会话模式比较适合单个规模小、执行时间短的大量作业。
会话模式会因为共享资源导致很多问题,所以为了更好的隔离资源,我们可以考虑为每一个作业单独启动一个集群,这就是所谓的单作业模式,如下图:
单作业模式也很好理解,就是严格的一对一,集群只为这个作业而生。同样地由客户端运行应用程序,然后启动集群,作业被提交给JobManager,继而分发给TaskManager执行。作业完成后,集群就会关闭,释放所占用的资源。
这些特性使得单作业模式在生产环境运行的更加稳定,所以是实际应用的首选模式。
需要注意的是,Flink本身无法直接这样运行,所以单作业模式一般会借助一些资源管理框架来启动集群,比如YARN、Kubernetes。
前面提到的两种部署模式下,应用代码都是在客户端执行,然后由客户端提交个jobManager。但是这种方式客户端需要占用大量的网络带宽,去下载依赖和把二进制文件分发给JobManager。加上很多情况下我们提交作业都是用的同一个client,就会加重客户端所在节点的资源消耗。
所以解决办法就是,我们不要客户端了,直接把作业提交给JobManager执行。而这也就代表着,我们需要为每一个作业单独启动一个JobManager,也就是创建一个集群。这个JobManager只为了执行这一个应用而存在,执行结束后JobManager也就关闭了,这就是所谓的应用模式,如下图所示:
应用模式和单作业模式,都是提交作业后再创建一个集群;单作业是通过客户端来提交的,客户端解析出的每一个作业对应一个集群;而应用模式下,是直接由JobManager执行应用程序的,并且即使应用包含了多个作业,也只创建一个集群。
这里我们所讲的部署模式,相对来说是比较抽象的概念。实际应用时,一般需要和资源管理平台结合起来,选择特定的模式来分配资源,部署应用。
独立模式是部署Flink最基础最简单的方式,所需的所有Flink组件都只是操作系统上运行的一个JVM进程。
独立模式是独立运行的,不依赖任何的资源管理平台;当然独立也是有代价的,如果资源不足,或者出现故障,没有自动拓展和重分配资源的保证,必须手动处理。
所以独立模式一般是只用于开发测试或作业非常少的场景。
不配置资源管理平台,通过start-cluster.sh启动时启动的就是会话模式。这时可以在集群上提交多个作业,但是资源是固定的,无法拓展和重分配,只有当运行的作业停止后才会释放出资源。
Flink本身无法直接以单作业方式启动集群,一般需要借助一些资源管理平台。所以Flink的独立集群并不支持单作业模式部署。
应由模式下不会提前创建集群,所以不能调用start-cluster.sh脚本。我们可以使用同样在bin目录下的standalone-job.sh来创建一个JobManager。
具体步骤如下:
./bin/standalone-jog.sh start --job-classname com.xx.xx.xx.StreamingWordCount
这里直接指定作业的入口类,脚本会自动扫描lib目录下的所有jar包。./bin/taskmanager.sh start
./bin/standalone-job.sh stop
./bin/taskmanager.sh stop
YARN上的部署过程是:客户端把Flink的应用提交给Yarn的ResourceManager,Yarn的RM会向Yarn的NodeManager申请容器。在这些容器上,Flink会部署JobManager和TaskManager的实例,从而启动集群。Flink会根据运行在JobManager上的作业所需要的Slot数量动态分配TaskManager资源。
在将Flink任务部署到YARN集群之前,需要确认集群是否安装有Hadoop,保证Hadoop版本至少在2.2以上,并且集群中安装有HDFS。
具体配置步骤如下:
sudo vim /etc/profile.d/my_env.sh
HADOOP_HOME=/opt/module/hadoop-2.7.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
#这里实际是执行hadoop classpath命令获取路径并返回
export HADOOP_CLASSPATH=`hadoop classpath`
start-dfs.sh
start-yarn.sh
参考官网详细描述:https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/yarn/
参考官网详细描述:https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/yarn/