我们来讨论下不同的Flink部署方式
Flink支持多种环境下的部署,比如本地调试,裸机集群,Hadoop YARN,Kubernetes集群.
在不同的环境下,JobManager,TaskManager ResourceManager以及Dispatcher的存在方式也是不同的,那么我们就说下不同环境下的Flink部署模式.
1. 独立集群
独立集群模式下部署Flink,至少包含一个主进程和一个TaskManager,可以运行在一台或者多台服务器上,整体架构如下
主进程中运行Dispatcher和ResourceManager,而TaskManager会将自己注册到ResourceManager中,如果提交了一个任务,那么流程如下
客户端将作业提交到Dispatcher,然后Dispatcher会启动一个新线程,运行JobManager
JobManager会尝试向ResourceManager申请必要的处理槽,并在必要的处理槽就绪后进行工作
在独立集群部署模式下,搭建的模式如下
去下载对应的二进制发行版,并进行解压
之后内部包含一个bin文件夹,内部包含了bash脚本,使用会启动一个主进程,并尝试在本地启动一个TaskManager,如果希望在多台机器上部署一个集群,那么可以考虑修改配置
1. 将所有需要运行TaskManager的主机名列在 ./conf/slaves文件中
2. Start-cluster.sh 脚本需要针对所有运行的TaskManager配置SSH免密登录
3. 目录在所有机器上保持一致
4. 设置./conf/flink-conf.yaml文件中的jobmanager.rpc.address一栏
之后就可以使用bash脚本启动了
2. Docker部署
Docker将Flink打包在容器中进行运行.
对于使用Docker进行部署Flink,需要部署两类容器,一个是运行Dispatcher,ResourceManager的主容器,一个是运行TaskManager的工作容器,TaskManager在启动之后会在ResourceManager上注册自己,Dispatcher会在收到一个作业后,启动一个JobManager线程来负责处理,JobManager会向ResourceManager中请求处理槽,之后ResourceManager将TaskManager分配给JobManager,之后进行执行作业.
两者的启动如下
之后就会自动运行
而且对应的Web ui会通过8081进行暴露,从而进行访问,这样就可以利用WEB ui进行上传jar包进行运行.
3. YARN
是Hadoop的资源管理组件,负责管理集群环境下的计算资源,集群机器的CPU,内存等
启动的方式有两种,分别是作业模式和会话模式,作业模式下,Flink集群启动后只会运行单个作业,
一旦作业结束,那么集群就会停止并归还资源,整体架构如下
会话模式下,系统会运行一个长期跑的Flink集群,运行多个作业
提交作业的时候,会连接YARN的ResourceManager,尝试启动一个YARN主进程,包含一个JobMananger和一个ResourceManager
JobManager会向Flink ResourceManager申请运行Flink作业的处理槽,然后Flink的ResrouceManager向着YARN的ResouceManager申请资源并启动TaskManager,启动完成,TaskManager会向ResouceManager中注册,Flink ResourceManager会向JobManager提供TaskManager,让其执行任务.
之后,这个集群就会长期运行,会一直运行多个作业.会在一开始启动一个包含Dispatcher和ResourceManager的ApplicationMaster.
那么客户端提交任务的时候,会连接到Dispatcher,启动一个JobManager线程,JobManager会向ResourceManager申请运行Flink作业所需的处理槽,那么随后Flink的ResourceManager会向着YARN的ResourceManager申请容器并启动TsakManager,如果获取到了,TaskManager会向ResourceManager进行注册.后者将其提供给JobManager,最后JobManager将任务放在TaskManager进行执行.
无论哪种模式,ResourceMananger都会自动对故障的TaskManager进行重启,这一点可以通过 ./conf/flink-conf.yaml进行配置.比如多少容器故障后就进行停止
如果希望能够将作业提交到YARN上执行,可以使用一下的命令
./bin/flink run -m yarn-cluster ./path/to/job.jar
这样就会提交到YARN集群上
或者通过./bin/yarn-session.sh脚本启动一个Flink YARN会话,脚本同样提供了很多控制容器大小和动态属性的参数
可以通过添加-d参数来启动一个分离模式的YARN会话.并利用YARN的应用工具来终止.
4. Kubernetes
Kubernetes为应用提供了高可用的保障,Flink在Kuberentes中进行部署,需要搭建两个Deployment来完成.一个运行主进程的Pod,一个用于工作进程的Pod,此外加上一个Service,负责暴露主进程Pod给工作进程Pod
制定了一个主进程容器,并配置了暴露端口,以及配置项
工作进程则类似,会指定多个副本,配置对应的启动项,并配置了对应的service名称方便链接
之后将其在K8S上创建出来,从而启动一个Flink容器
如果希望在外部访问其WebUI,可以通过nodeport暴露出去
之后就一通过Web UI查看应用了.