近期,由于项目需要,对于基于docker进行flink job部署进行了小规模测试,顺便对于flink运行机制进行了深入的了解。
为了达到快速部署和基础环境稳定的目的,考虑使用docker部署(k8s基础环境搭建复杂,调研中未使用),参考官方文档如下:
flink部署模式有下列三种:
- session,全局单一cluster,所有的job运行于单一集群,全局只有一个job manager
- application,每个job有一个job manager,job manager分配task manager
- per-job,每个job有一个job manager,job manager分配task manager,但job graph由job manager生成
基于docker部署时,不支持per-job mode,我们选择application mode进行部署。
如果选择基于local file进行checkpoint,需要将container内checkpoint所在的目录进行volume至宿主机,保证docker restart时能够从上次的checkpoint开始消费。
使用的基础镜像为flink:1.12.7-scala_2.11-java8
在per-job mode中,我们向job manager传递parallelism.default参数,指定该job需要的task slot总数,然后由yarn调度。但在docker部署中,由于缺失统一的资源调度工具,只能手动设置task manager的scale和taskmanager.numberOfTaskSlots,保证task manager的数量,缺乏扩容能力。因此,在生产环境部署中,推荐使用native k8s + application mode部署flink任务。
文件夹权限问题
众所周知,flink任务依赖checkpoint机制,为了保证成功生成checkpoint,需要将task manager和job manager的checkpoint命令映射到外部同一目录(checkpoint由job manager生成meta data和删除)。
由于flink任务在启动时使用的用户为flink,因此,在build image时需要将docker内部用于存储checkpoint的目录修改所有者(chown)。
使用minio做checkpoint的问题
使用minio作为checkpoint的外部存储时,要注意s3.endpoint配置。
配置格式通常为http://${host}:${port},其中的host命名需要满足s3命名规范,不能出现下划线,详细命名规则如下: