博文标签:#Docker #Flink #大数据实时计算 #容器化部署 #流处理
阅读时长:8分钟|实操难度:⭐⭐(零基础可复刻)
一、前言:为什么要用Docker运行Flink?
Apache Flink 作为当下大数据领域主流的分布式实时流处理框架,主打低延迟、高吞吐、状态一致性计算,广泛用于实时大屏、日志ETL、风控预警、数仓实时分层等业务。
传统物理机/虚拟机部署Flink痛点极多:
- 环境依赖繁琐:JDK版本、Scala版本、集群配置、环境变量适配耗时
- 集群搭建复杂:手动配置JobManager、TaskManager节点、通信端口、集群组网
- 环境不一致:开发、测试、生产环境版本差异化,任务本地能跑线上报错
- 扩缩容麻烦:新增计算节点需要重复部署环境,运维成本高
而Docker容器化运行Flink完美解决以上问题,核心优势:
- 开箱即用:官方镜像预装JDK、Flink运行环境,无需手动配置依赖
- 部署极简:单条命令拉起集群,5分钟搭建可用Flink环境
- 环境隔离:容器独立运行,不污染本机系统环境
- 弹性扩缩容:随时新增TaskManager计算节点,适配算力需求
- 跨平台复用:Windows/Mac/Linux均可一套命令运行,环境完全一致
二、前置环境准备
1. 基础软件要求
- Docker 版本:20.10+(推荐最新稳定版)
- Docker Compose:v2+(新版Docker内置compose,无需单独安装)
- 主机资源:最低2核4G,建议4核8G,避免Flink任务OOM内存溢出
- 端口放行:主机8081端口(Flink WebUI控制台)对外开放
2. Flink镜像选型说明
优先使用Docker官方维护Flink镜像,标签规则:flink:<版本>-scala_<scala版本>-java17
本次博文选用稳定生产版本:flink:1.20.0-scala_2.12-java17
- 1.20.x:长期支持稳定版,企业生产首选
- scala_2.12:主流编译Scala版本,兼容绝大多数连接器
- java17:官方新版适配JDK,性能优于JDK8
三、两种部署模式实操(新手推荐Compose集群模式)
Flink架构分为两大核心角色:
- JobManager:集群管理节点,负责任务调度、资源分配、Web管控
- TaskManager:工作计算节点,负责执行业务流式任务
模式一:Docker命令行手动搭建Flink集群(适合临时测试)
手动创建网桥、启动管理节点、启动计算节点,适合快速调试,熟悉集群组网逻辑。
步骤1:创建专属Docker网桥
保证JobManager和TaskManager容器互通,固定网络通信:
# 创建flink专属网络
docker network create flink-net
步骤2:启动JobManager管理节点
docker run -d \
--name flink-jm \
--network flink-net \
-p 8081:8081 \
-e JOB_MANAGER_RPC_ADDRESS=flink-jm \
-e JOB_MANAGER_HEAP_SIZE=1024m \
flink:1.20.0-scala_2.12-java17 jobmanager
参数详解:
JOB_MANAGER_RPC_ADDRESS:通信地址,必须和容器name一致,节点互通核心参数JOB_MANAGER_HEAP_SIZE:管理节点堆内存,测试环境1G足够- 8081:8081:映射Web控制台端口,浏览器访问集群
步骤3:启动TaskManager计算节点
docker run -d \
--name flink-tm1 \
--network flink-net \
-e JOB_MANAGER_RPC_ADDRESS=flink-jm \
-e TASK_MANAGER_HEAP_SIZE=2048m \
flink:1.20.0-scala_2.12-java17 taskmanager
如需扩容算力,直接复制命令新增tm2、tm3节点即可,无需任何额外配置。
模式二:Docker Compose一键编排集群(推荐开发/常驻使用)
Compose统一管理节点配置、内存、网络、开机自启,一行命令启停集群,方便持久化使用。
步骤1:新建docker-compose.yml文件
新建文件夹flink-docker,在目录内创建配置文件,完整可直接复制:
version: '3.8'
services:
# Flink管理节点
jobmanager:
image: flink:1.20.0-scala_2.12-java17
container_name: flink-jobmanager
restart: always
ports:
- "8081:8081"
environment:
FLINK_PROPERTIES: "jobmanager.rpc.address: jobmanager"
JOB_MANAGER_HEAP_SIZE: 1024m
volumes:
# 挂载本地目录,存放业务jar包、任务checkpoint快照
- ./flink-jobs:/opt/flink/jobs
- ./flink-checkpoint:/opt/flink/checkpoint
# Flink计算节点
taskmanager:
image: flink:1.20.0-scala_2.12-java17
container_name: flink-taskmanager
restart: always
depends_on:
- jobmanager
environment:
FLINK_PROPERTIES: "jobmanager.rpc.address: jobmanager"
TASK_MANAGER_HEAP_SIZE: 2048m
volumes:
- ./flink-jobs:/opt/flink/jobs
- ./flink-checkpoint:/opt/flink/checkpoint
deploy:
replicas: 2 # 默认启动2个计算节点,按需修改数量
步骤2:一键启停集群命令
# 后台启动集群
docker compose up -d
# 停止集群(保留数据)
docker compose down
# 销毁集群(清空容器,保留挂载数据)
docker compose down
四、集群验证+官方示例任务运行
1. 访问Flink Web控制台
浏览器直接访问:http://localhost:8081
页面可查看:集群节点数量、可用算力、TaskManager槽位、运行中任务,部署成功示意:JobManager正常就绪,2个TaskManager节点在线。
2. 运行官方流式测试任务
进入JobManager容器内部,执行自带词频统计流任务,验证集群调度正常:
# 进入管理节点容器
docker exec -it flink-jobmanager bash
# 执行自带流式词频任务
flink run /opt/flink/examples/streaming/WordCount.jar
返回执行成功,WebUI页面可看到运行中的流式任务,代表集群完全可用。
3. 自定义Jar包提交任务
将本地开发好的Flink业务jar放入宿主机 ./flink-jobs 挂载目录,容器内直接提交:
flink run /opt/flink/jobs/自定义业务.jar
五、常用运维命令汇总
# 查看flink容器运行状态
docker ps | grep flink
# 实时查看JobManager日志
docker logs -f flink-jobmanager
# 动态扩容TaskManager节点
docker compose up -d --scale taskmanager=3
# 终止指定Flink任务(通过WebUI获取jobId)
flink cancel 任务ID
六、Docker运行Flink高频踩坑解决方案
坑1:TaskManager无法连接JobManager,集群节点失联
原因:RPC通信地址不一致、不在同一网桥、防火墙拦截端口
解决:RPC地址必须和JobManager容器名完全一致,所有节点加入同一个docker网络,放行6123通信端口。
坑2:任务运行报OOM内存溢出
原因:容器内存限制过小、TaskManager堆内存配置不足
解决:修改环境变量TASK_MANAGER_HEAP_SIZE,业务任务至少分配2G以上内存,compose中增加容器内存资源限制。
坑3:Checkpoint快照保存失败
原因:宿主机挂载目录无读写权限
解决:提前给本地挂载目录授权 chmod 777 ./flink-checkpoint,保证容器读写权限。
坑4:外网无法访问8081控制台
解决:服务器安全组放行8081端口,Docker端口映射无误,关闭本机防火墙限制。
七、Flink容器化部署优化建议(生产可用)
- 镜像自定义:基于官方镜像,打包kafka、mysql、redis等业务常用连接器,避免每次任务动态下载依赖
- 数据持久化:务必挂载checkpoint、savepoint目录,容器销毁不丢失任务状态,支持任务断点续跑
- 资源限制:生产环境固定每个TaskManager CPU、内存上限,防止抢占主机资源
- 日志采集:挂载容器日志目录,对接ELK实现Flink任务日志统一检索告警
- 版本固定:禁止使用latest镜像标签,固定Flink、Scala版本,避免自动更新导致兼容性故障
八、总结
Docker部署Flink,彻底简化了大数据实时集群的搭建门槛:
- 新手学习:5分钟快速搭建学习环境,不用适配繁杂JDK、集群配置
- 开发调试:本机容器环境和线上生产环境高度一致,杜绝环境差异化bug
- 小型业务:Compose集群可直接承载中小流量实时业务,轻量化运维,成本远低于K8s部署
后续博文会更新:Docker-Flink整合Kafka数据源、Docker部署Flink SQL客户端、Flink容器化状态备份恢复实操,欢迎点赞收藏关注~
文末福利:本文yml配置文件、常用调优参数整理已打包,评论区留言直接获取完整版配置!