使用Docker配置Flink1.12开发测试环境
简单介绍
Docker现在是开发界必不可少的工具,我们使用docker能够快速将自己的应用进行测试和打包。同时利用容器我们在软件开发中很容就实现了CI和CD的部署配置。当前Flink的官方的基础镜像都可以从docker hub中下载。不过docker hub在前一段时间对游客进行了限速,所以当你遇到下载速度很慢的时候请先使用
docker login
登录以后再使用docker pull
来拉取镜像文件。使用Docker的镜像我们可以构建Session模式或者Application模式的Flink集群。下面我将一步步的给大家介绍。
在docker的环境下启动一个Flink session集群
每个session集群可以同时跑多个Flink的任务,当然需要你的资源足够。Flink集群需要先启动才能跑任务。跑一个Flink sesssion的集群,要跑一个 JobManager 的容器和多个 TaskManager 容器。JobManager和TaskManager的通信采用了rpc的方式,但在docker环境下我们首先要创建一个Flink专用的网络,当然,如果是使用docker-compose的话会默认创建。
如果你没有环境,看这里快速 [搭建docker环境](https://blog.csdn.net/lihengzkj/article/details/116136604)- 首先创建Flink自用的网络,当然你也可以不创建使用默认的网络:
docker network creat flink-test-network
- 使用docker运行一个JobManager:
docker run -d \ --name jobnamager \ --network flink-test-network \ -- publish 8081:8081 --env jobmanager.rpc.address=jobmanager \ flink:1.12.2-scala_2.11-java11 jobmanager
- 使用docker运行一个taskmanager
docker run -d \ --name taskmanager \ --network flink-test-network \ --env jobmanager.rpc.address=jobmanager \ flink:1.12.2-scala_2.11-java11 taskmanager
- 访问:http://localhost:8081
- 测试:通过UI上传Jar包测试,或者通过client端运行测试代码。
- 停止集群:
- 找出容器的id:
docker ps | grep -E "(jobmanager|taskmanager)"
- 删除容器:
docker rm -f 容器id
- 找出容器的id:
部署方式
Flink的镜像包含一个常规它常规的配置和入口脚本。我们可以通过入口脚本来启动Flink集群。
- JobManager的部署模式有:
- Seesion集群模式
- Application集群模式
- TaskManager适应任何模式
上面两种模式具体有什么区别,请看我的这篇介绍:[Flink1.12.3部署模式介绍](https://blog.csdn.net/lihengzkj/article/details/116474617)
Docker上的Application模式
这种模式下,Flink整个集群就只跑了一个job, 也就是说当集群启动,这个唯一job就启动了。
这种模式需要我们预先把我们实现好的jar包放进image或者container,同时要注意的是要把相应的依赖也要放进来 ,最好的做法就是把所有的依赖统一打成一个包。下面给大家介绍具体的步骤:
本地测试环境
- 把你的jar包,对于Flink来说叫artifact, 通过
mount
的方式或者volume
的方式放到/opt/flink/artifacts - 以Application集群模式启动JobManager
- 启动一个或者多个TaskManager
在docker的环境下,使用下面的命令可以实现:
- 首先还是创建专有的网络:
docker network creat flink-network
- 挂载我们的jar包并启动一个jobmanager:[]中的jobid, savepoint, arguments都是可选项,程序需要即可填入
docker run \ --mount type=bind,src=/host/path/to/job/xxx1.jar,target=/opt/flink/artifacts/xxx1.jar \ --mount type=bind,src=/host/path/to/job/xxx2.jar,target=/opt/flink/artifacts/xxx2.jar \ --rm \ --env jobmanager.rpc.address=jobmanager \ --name=jobmanager \ --network flink-network \ flink:1.12.2-scala_2.11-java11 standalone-job \ --job-classname com.job.ClassName \ [--job-id <job id>] \ [--fromSavepoint /path/to/savepoint [--allowNonRestoredState]] \ [job arguments]
- 挂载我们的jar包并启动一个taskmanager:
docker run \ --mount type=bind,src=/host/path/to/job/xxx1.jar,target=/opt/flink/artifacts/xxx1.jar \ --mount type=bind,src=/host/path/to/job/xxx2.jar,target=/opt/flink/artifacts/xxx2.jar \ --env jobmanager.rpc.address=jobmanager \ flink:1.12.2-scala_2.11-java11 taskmanager
CI测试环境
如果你的开发测试在gitlab上,那么可以使用Dockerfile来自动的创建Flink的jobmanager和taskmanager的本地镜像.
- 假如我们有一个Java项目的gitlab上,那么在项目根目录上创建Dockerfile。这里需要注意的是,项目的根目录我们通常能够直接使用maven命令来打包。
FROM maven:xxx
RUN mvn clean install/package
FROM flink:1.12.2-scala_2.11-java11
ADD ./target/xxx.jar /opt/flink/artifacts/xxx.jar
- 打包成镜像:
docker build -t flink:local-1.0 .
- 执行:
- 还是按照上面的application模式来跑一个jobmanager:
docker run \ flink:local-1.0 standalone-job \ --job-classname com.job.ClassName
- 然后是跑一个taskmanager:
docker run flink:local-1.0 taskmanager
.
docker-compose 环境使用的session cluster
通常来说我们做测试都需要一个稳定的session cluster环境,下面给大家提供一个docker-compose的环境,只需要在docker-compose下运行就会启动给一个Jobmanager一个taskmanager的集群,当然你可以在yaml文件中复制多个taskmanager,只要你的资源够用。
version: "3.8"
services:
flink:
image: flink:1.12.2-scala_2.11-java11
restart: unless-stopped
command: jobmanager
environment:
JOB_MANAGER_RPC_ADDRESS: flink
FLINK_PROPERTIES: |
cluster.evenly-spread-out-slots: true
restart-strategy: failure-rate
restart-strategy.failure-rate.delay: 10 s
restart-strategy.failure-rate.failure-rate-interval: 10
restart-strategy.failure-rate.max-failures-per-interval: 2
ports: [8081:8081]
volumes:
- /opt/flink/log
- /tmp
flink-worker:
image: flink:1.12.2-scala_2.11-java11
restart: unless-stopped
command: taskmanager
environment:
JOB_MANAGER_RPC_ADDRESS: flink
depends_on: [flink]
volumes:
- /opt/flink/log
- /tmp