1. Flink 1.20 Docker单机部署实战
作为一名长期奋战在大数据一线的工程师,我深知快速搭建测试环境的重要性。今天要分享的是基于Docker的Flink 1.20单机部署方案,这个方案经过我们团队多次迭代优化,已经成为内部标准化的开发环境配置。
1.1 为什么选择Docker部署
在本地开发测试场景下,Docker部署Flink具有显著优势:
- 环境隔离干净:不会污染宿主机环境,避免版本冲突
- 启动速度快:相比传统集群部署,从零到运行只需5分钟
- 配置灵活:通过volume挂载实现配置热更新
- 资源占用少:单机模式对硬件要求低,适合笔记本开发
生产环境建议使用K8s或YARN部署,但本地开发测试场景下Docker方案无疑是最佳选择
1.2 准备工作
1.2.1 硬件要求
建议配置:
- 至少4核CPU
- 8GB内存
- 20GB可用磁盘空间
1.2.2 软件依赖
确保已安装:
- Docker 20.10+
- Docker Compose 2.0+
- 建议使用Linux或MacOS系统(Windows需配置WSL2)
2. 详细部署步骤
2.1 目录结构规划
合理的目录结构是后续维护的基础,建议按以下方式创建:
mkdir -p /data/flink/{lib,conf,sql,checkpoints,savepoints,jars}目录用途说明:
| 目录 | 用途 | 生产环境建议 |
|---|---|---|
| lib | 存放额外jar包(连接器、驱动等) | 建议使用Nexus私服管理 |
| conf | 自定义配置文件 | 建议版本化管理 |
| sql | Flink SQL脚本 | 建议Git管理 |
| checkpoints | Checkpoint持久化目录 | 建议使用分布式存储 |
| savepoints | Savepoint持久化目录 | 建议定期清理 |
| jars | 监控相关依赖包 | 可纳入CI/CD流程 |
2.2 监控依赖安装(可选)
如果需要采集系统资源指标,需要额外下载以下依赖:
# OSHI核心库 - Java系统信息采集神器 wget -P /data/flink/jars https://repo1.maven.org/maven2/com/github/oshi/oshi-core/6.4.11/oshi-core-6.4.11.jar # JNA及其平台库 - OSHI的底层依赖 wget -P /data/flink/jars https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar wget -P /data/flink/jars https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0.jar监控功能会增加约5%的资源开销,如果只是简单测试可以跳过
2.3 Docker Compose配置详解
创建docker-compose.yml文件,这是整个部署的核心:
version: '3.8' services: jobmanager: image: flink:1.20.1-scala_2.12-java17 hostname: jobmanager ports: - "8081:8081" # Web UI - "6123:6123" # RPC端口 - "9020:9020" # Prometheus指标端口 command: jobmanager environment: - TZ=Asia/Shanghai - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager state.backend: filesystem state.checkpoints.dir: file:///opt/flink/checkpoints/ state.savepoints.dir: file:///opt/flink/savepoints/ execution.checkpointing.interval: 30000 metrics.reporters: prom metrics.reporter.prom.factory.class: org.apache.flink.metrics.prometheus.PrometheusReporterFactory metrics.reporter.prom.port: 9020 metrics.system-resource: true volumes: - /data/flink/jars/oshi-core-6.4.11.jar:/opt/flink/lib/oshi-core-6.4.11.jar - /data/flink/jars/jna-5.13.0.jar:/opt/flink/lib/jna-5.13.0.jar - /data/flink/jars/jna-platform-5.13.0.jar:/opt/flink/lib/jna-platform-5.13.0.jar - /data/flink/checkpoints:/opt/flink/checkpoints - /data/flink/savepoints:/opt/flink/savepoints taskmanager: image: flink:1.20.1-scala_2.12-java17 depends_on: - jobmanager command: taskmanager ports: - "9021:9021" # Prometheus指标端口 environment: - TZ=Asia/Shanghai - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager state.backend: filesystem state.checkpoints.dir: file:///opt/flink/checkpoints/ state.savepoints.dir: file:///opt/flink/savepoints/ taskmanager.numberOfTaskSlots: 4 metrics.reporters: prom metrics.reporter.prom.factory.class: org.apache.flink.metrics.prometheus.PrometheusReporterFactory metrics.reporter.prom.port: 9021-9040 metrics.system-resource: true volumes: - /data/flink/jars/oshi-core-6.4.11.jar:/opt/flink/lib/oshi-core-6.4.11.jar - /data/flink/jars/jna-5.13.0.jar:/opt/flink/lib/jna-5.13.0.jar - /data/flink/jars/jna-platform-5.13.0.jar:/opt/flink/lib/jna-platform-5.13.0.jar - /data/flink/checkpoints:/opt/flink/checkpoints - /data/flink/savepoints:/opt/flink/savepoints关键配置解析:
| 配置项 | 说明 | 生产建议 |
|---|---|---|
| state.backend | 状态后端类型 | 生产建议用RocksDB |
| execution.checkpointing.interval | Checkpoint间隔 | 根据业务容忍度调整 |
| taskmanager.numberOfTaskSlots | 每个TM的slot数 | 建议设置为CPU核心数 |
| metrics.reporter.prom.port | 指标端口 | 多TM时需要范围端口 |
特别注意:
metrics.reporters: prom这行后面绝对不能加注释,否则会导致配置解析失败
3. 服务启动与验证
3.1 启动服务
docker compose up -d检查服务状态:
docker compose ps正常应该看到两个服务状态为running
3.2 访问Web UI
浏览器打开http://localhost:8081,应该能看到Flink的Web界面:
3.3 提交测试任务
准备一个简单的SQL文件/data/flink/sql/test.sql:
-- 创建数据源表 CREATE TABLE source_table ( id INT, data STRING ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '10' ); -- 创建结果表 CREATE TABLE print_table ( id INT, data STRING ) WITH ( 'connector' = 'print' ); -- 执行查询 INSERT INTO print_table SELECT * FROM source_table;提交任务:
docker exec -it flink-jobmanager-1 /opt/flink/bin/sql-client.sh -f /opt/flink/sql/test.sql4. 监控配置
4.1 Prometheus采集配置
在Prometheus的prometheus.yml中添加:
scrape_configs: - job_name: 'flink-jm' static_configs: - targets: ['jobmanager:9020'] labels: group: jm - job_name: 'flink-tm' static_configs: - targets: ['taskmanager:9021'] labels: group: tm4.2 告警规则配置
创建flink-rules.yml,包含三类告警规则:
任务级告警:
- 任务停止
- 任务重启
- Checkpoint失败
TaskManager告警:
- 内存使用过高
- GC时间过长
- 反压告警
集群级告警:
- JobManager不可用
- TaskManager不可用
- Slot不足
完整规则示例:
groups: - name: flink-job-alerts rules: - alert: Flink任务停止运行 expr: flink_jobmanager_job_uptime == 0 for: 1m labels: severity: critical annotations: summary: "任务 {{ $labels.job_name }} 已停止" - name: flink-taskmanager-alerts rules: - alert: Flink TM堆内存过高 expr: flink_taskmanager_Status_JVM_Memory_Heap_Used / flink_taskmanager_Status_JVM_Memory_Heap_Max > 0.85 for: 5m labels: severity: warning - name: flink-cluster-alerts rules: - alert: Flink JobManager不可用 expr: up{job="flink-jm"} == 0 for: 1m labels: severity: critical5. 生产环境优化建议
虽然本文是单机部署方案,但有些优化点同样适用于生产环境:
状态后端优化:
- 使用RocksDB替代文件系统
- 配置增量Checkpoint
- 设置合理的state.ttl
资源调优:
- 调整JVM堆内存比例
- 配置合理的网络缓冲区
- 设置适当的并行度
高可用配置:
- 配置ZooKeeper集群
- 设置多个JobManager
- 配置HA存储目录
6. 常见问题排查
6.1 TaskManager连接失败
现象:TaskManager日志显示连接JobManager失败
排查步骤:
- 检查
jobmanager.rpc.address配置 - 验证网络连通性
- 检查端口映射是否正确
6.2 Checkpoint失败
现象:Web UI显示Checkpoint失败
解决方案:
- 检查目录权限
chmod -R 777 /data/flink/checkpoints - 增加Checkpoint超时时间
- 检查磁盘空间
6.3 指标采集异常
现象:Prometheus无法采集指标
排查步骤:
- 验证端口是否开放
nc -zv localhost 9020 - 检查OSHI和JNA依赖是否正确安装
- 查看Flink日志确认Reporter初始化是否成功
7. 扩展与定制
7.1 添加自定义连接器
将连接器jar包放入/data/flink/lib目录,例如Kafka连接器:
wget -P /data/flink/lib https://repo1.maven.org/maven2/org/apache/flink/flink-connector-kafka/1.20.1/flink-connector-kafka-1.20.1.jar7.2 多TaskManager部署
复制taskmanager服务配置并修改名称:
taskmanager2: <<: *taskmanager ports: - "9022:9022"7.3 自定义配置
创建/data/flink/conf/flink-conf.yaml进行个性化配置,然后在compose文件中取消对应挂载注释
8. 性能测试数据
我们在4核8G的机器上进行了基准测试:
| 场景 | TPS | 延迟 | 资源占用 |
|---|---|---|---|
| 单TM单Slot | 5k | 50ms | CPU 30% |
| 单TM4Slot | 18k | 45ms | CPU 85% |
| 双TM各4Slot | 35k | 40ms | CPU 90% |
测试使用DataGen源和Print Sink,实际业务性能会有所不同
9. 版本升级指南
升级到新版本Flink的步骤:
- 修改compose文件中的镜像版本
- 停止现有服务
docker compose down - 备份checkpoints和savepoints
- 启动新版本服务
docker compose up -d - 从savepoint恢复任务
10. 最佳实践总结
经过多个项目的实践验证,我们总结了以下经验:
- 目录权限:提前设置好挂载目录的权限,避免运行时出错
- 资源配置:根据任务特点调整TM的slot数和堆内存大小
- 监控告警:至少配置任务停止和Checkpoint失败的告警
- 版本管理:将docker-compose.yml纳入版本控制
- 日志收集:配置ELK收集容器日志,方便排查问题
这套方案已经在我们团队内部使用了2年多,支撑了数十个开发测试环境的快速搭建。特别是在POC验证阶段,能够帮助研发同学快速验证想法,大幅提升了开发效率。