Docker中部署Flink:快速部署调试各版本
应用场景
Flink 在 Docker 中的应用场景主要是为了简化集群的部署和管理,特别是在开发、测试以及小规模生产环境中。使用 Docker 可以快速启动、停止和重启集群,避免手动配置和依赖管理的复杂性。以下是一些具体的应用场景和适合使用 Docker 的情况:
1. 快速本地开发与测试
• 场景: 开发者在本地环境中测试 Flink 作业或应用时,不需要配置复杂的集群环境。
• 优势: Docker 可以快速搭建完整的 Flink 环境,包括 JobManager 和 TaskManager,无需手动安装或配置依赖。
1. 分布式计算的调试与调优
• 场景: 需要对 Flink 的分布式计算特性进行调试或性能调优。
• 优势: 通过 Docker,开发者可以模拟集群环境下的分布式任务执行,调整并行度、任务槽(task slots)等配置以优化性能。
1. 集群环境的一键部署
• 场景: 需要快速部署一个可用的 Flink 集群用于演示或实验。
• 优势: 使用 Docker Compose 可以轻松启动包含多个 TaskManager 和 JobManager 的 Flink 集群,适合进行短期测试或实验。
1. 持续集成/持续部署(CI/CD)
• 场景: 在自动化的 CI/CD 流程中运行 Flink 作业进行测试或验证。
• 优势: Docker 容器化的 Flink 环境可以嵌入到 CI/CD 管道中,实现 Flink 作业的自动化测试和部署。
1. 简化的依赖管理
• 场景: 在不同环境中运行 Flink 时,存在 JDK、Scala 或其他依赖的版本冲突。
• 优势: 使用 Docker 可以打包所有所需依赖,确保不同环境下的一致性,避免版本冲突问题。
1. 临时或小规模生产环境
• 场景: 临时项目或小规模的生产环境中,要求快速搭建并处理流数据任务。
• 优势: Docker 提供的轻量化隔离环境,可以满足这些需求,而无需部署复杂的大规模集群。
环境准备
在开始之前,确保你拥有以下版本的工具:
• Flink:1.16.3
• Scala:2.12
• JDK:1.8
• Docker:已安装
拉取Flink镜像
首先,使用以下命令从 Docker Hub 拉取指定版本的 Flink 镜像:
docker pull flink:1.16.3-scala_2.12-java8
如果由于网络问题无法拉取该镜像,可以使用阿里云的加速镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/images-speed-up/flink:1.16.3-scala_2.12-java8
提示: 不同版本的镜像可以在 [Docker Hub] https://hub.docker.com/_/flink/tags?page_size=&ordering=&name=1.16.3 上进行查找。
启动 Flink 集群
1. 创建工作目录
首先,创建一个目录用于存放 Flink 集群的相关文件:
mkdir ~/flink && cd ~/flink
2. 创建 Docker Compose 文件
在该目录下创建一个名为 docker-compose.yml 的文件,内容如下:
version: '3'
services:
jobmanager:
image: flink:1.16.3-scala_2.12-java8
hostname: jobmanager
container_name: jobmanager
ports:
- "8081:8081"
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
parallelism.default: 1
command: jobmanager
taskmanager:
image: flink:1.16.3-scala_2.12-java8
hostname: taskmanager
container_name: taskmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
parallelism.default: 1
depends_on:
- jobmanager
command: taskmanager
3. 启动 Flink 集群
通过以下命令启动 Flink 集群:
docker-compose up -d
等待容器启动后,你可以通过访问 http://localhost:8081
来打开 Flink 的 Web 界面,以检查集群是否成功启动。
同时也可以看到我们上面设置的配置slot参数也生效
4. 参数说明
服务名称 | 配置项 | 说明 |
jobmanager | image | 使用指定版本的 Flink 镜像启动容器 |
hostname | 设置容器主机名为 jobmanager | |
container_name | 容器名称为 jobmanager | |
ports | 将容器的 8081 端口映射到宿主机的 8081 端口 | |
environment | 设置环境变量,配置 Flink 的属性,包括 jobmanager 的 RPC 地址和默认并行度 | |
command | 指定启动 jobmanager 服务 | |
taskmanager | image | 使用相同的 Flink 镜像启动容器 |
hostname | 设置容器主机名为 taskmanager | |
container_name | 容器名称为 taskmanager | |
environment | 设置环境变量,包括 TaskManager 的 Task Slots 数量和默认并行度 | |
depends_on | 依赖于 jobmanager 服务,确保先启动 jobmanager | |
command | 启动 taskmanager 服务 |
运行 Flink 程序
1. 准备测试程序
测试程序包括以下文件:
•
flink-docker-1.0.jar
:用于循环统计单词数量的测试代码。•
lib/
:依赖的外部库文件。•
start.sh
:启动脚本。
将这些文件复制到 jobmanager
容器中:
docker cp flink-docker-1.0.jar jobmanager:/flink-docker-1.0.jar
docker cp lib/ jobmanager:/flink-docker-lib/
docker cp start.sh jobmanager:/start.sh
可以通过以下命令查看文件是否成功复制:
docker exec jobmanager ls /
2. 运行测试程序
在 jobmanager
容器中执行以下命令,运行测试程序:
docker exec -it jobmanager bash /start.sh
你可以通过 Flink 的 Web UI 监控作业的执行情况,访问 http://localhost:8081
,在 Running Jobs 选项卡中查看当前正在运行的作业。
提示: 对于简单任务,Flink 的 Web UI 提交任务也是一个便捷选择。
总结
通过本文介绍的步骤,你可以快速搭建并运行一个基于 Docker 的 Flink 集群,并且可以部署我们自己的应用程序。接下来,你可以根据需要调整 TaskManager 的数量、任务并行度等配置,以满足实际应用需求。
参考资料
• 官方文档:Flink 集群 Docker 部署:https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/standalone/docker/
欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。