说明:生产环境预制的、开箱即用的"Flink + Iceberg 数据湖运行时容器"
流程图

方式一(挂载)"注意"
提示!使用挂载会存在jar冲突,需要取解决jar冲突的问题。
创建文件夹存放JAR包文件:

新增Jar包挂载配置:
修改的是"docker-compose.yml"
bash
version: "3.8"
services:
jobmanager:
image: flink:1.19.1-scala_2.12
container_name: jobmanager
hostname: jobmanager
ports:
- "8081:8081"
- "6123:6123"
command: jobmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
parallelism.default: 1
volumes:
- ./data/jobmanager:/opt/flink/data
- ./logs/jobmanager:/opt/flink/log
# +++ 新增的Jar包挂载配置 +++
- D:/Docker/jar/iceberg:/opt/flink/lib/iceberg
taskmanager:
image: flink:1.19.1-scala_2.12
container_name: taskmanager
hostname: taskmanager
depends_on:
- jobmanager
command: taskmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
ports:
- "6121:6121"
- "6122:6122"
volumes:
- ./data/taskmanager:/opt/flink/data
- ./logs/taskmanager:/opt/flink/log
# +++ 新增的Jar包挂载配置 +++
- D:/Docker/jar/iceberg:/opt/flink/lib/iceberg
Docker执行命令:
停止服务运行(执行以下命令,Docker Desptop镜像也会被删除)
bash
docker-compose down
运行docker-compose up -d启动服务
bash
docker-compose up -d
验证:
验证挂载是否成功启动后,可以通过以下命令验证 JAR 包是否已成功挂载到容器内的指定路径:
bash
# 进入jobmanager容器
docker exec -it jobmanager bash
# 查看/opt/flink/lib/iceberg目录下的文件
ls /opt/flink/lib/iceberg/
应该能看到 iceberg-flink-runtime-2.0-1.10.1.jar 这个文件,说明以及挂载成功!!!

使用Apache Flink+Apache Iceberg 执行SQL出现的错误!(解决方案)
**因为是jar冲突或缺失依赖导致,选择方案二:运行时添加,打造"**生产环境预制的 " 数据湖容器。
统一挂载整个jar目录
将你本地的 D:/Docker/jar 整个目录挂载到容器内的一个统一路径下(例如 /opt/flink/lib/user_libs),这样你可以自由管理所有JAR包,无需反复修改yml文件
修改后的 docker-compose.yml:
bash
version: "3.8"
services:
jobmanager:
image: flink:1.19.1-scala_2.12
container_name: jobmanager
hostname: jobmanager
ports:
- "8081:8081"
- "6123:6123"
command: jobmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
parallelism.default: 1
volumes:
- ./data/jobmanager:/opt/flink/data
- ./logs/jobmanager:/opt/flink/log
# +++ 挂载整个jar目录到容器的统一路径 +++
- D:/Docker/jar:/opt/flink/lib/user_libs
taskmanager:
image: flink:1.19.1-scala_2.12
container_name: taskmanager
hostname: taskmanager
depends_on:
- jobmanager
command: taskmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
ports:
- "6121:6121"
- "6122:6122"
volumes:
- ./data/taskmanager:/opt/flink/data
- ./logs/taskmanager:/opt/flink/log
# +++ 挂载整个jar目录到容器的统一路径 +++
- D:/Docker/jar:/opt/flink/lib/user_libs
下一步需要:
- 整理你的JAR包:确保 iceberg-flink-runtime-1.19-1.10.1.jar 和 hadoop-common-3.3.6.jar 都直接放在 D:\Docker\jar 目录下,或者在其子目录中。Flink的类加载器会递归扫描 lib/ 下的所有JAR。目录结构与类加载原理如下图:

-
重启服务:
bashcd D:\Docker\flink docker-compose down docker-compose up -d -
验证:进入容器查看文件是否挂载成功。
bashdocker exec jobmanager find /opt/flink/lib/user_libs -name "*.jar"
方式二(运行时添加)"推荐"
创建文件命名为"Dockerfile"
FROM apache/flink:1.19.1-scala_2.12-java11
将准备好的JAR包复制到镜像的 lib 目录
COPY ./jar/iceberg/iceberg-flink-runtime-1.19-1.9.1.jar /opt/flink/lib/
COPY ./jar/hive/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar /opt/flink/lib/
创建文件命名为"docker-compose.yml"
bash
version: "3.8"
services:
jobmanager:
image: my-flink-iceberg:1.19.1 # 自定义镜像
container_name: jobmanager
hostname: jobmanager
ports:
- "8081:8081"
- "6123:6123"
command: jobmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
parallelism.default: 1
volumes:
- ./data/jobmanager:/opt/flink/data
- ./logs/jobmanager:/opt/flink/log
taskmanager:
image: my-flink-iceberg:1.19.1 # 自定义镜像
container_name: taskmanager
hostname: taskmanager
depends_on:
- jobmanager
command: taskmanager
environment:
- |
FLINK_PROPERTIES=
jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 2
ports:
- "6121:6121"
- "6122:6122"
volumes:
- ./data/taskmanager:/opt/flink/data
- ./logs/taskmanager:/opt/flink/log
jar存放


执行命令:
bash
-- 进入 Flink 根目录
cd D:\Docker\flink
-- 清理旧的 Flink 集群容器,为新配置生效做准备
docker-compose down
-- 后台启动基于最新配置的 Flink 集群
docker-compose up -d
-- 进入 JobManager 容器的交互式终端
docker exec -it jobmanager bash
-- 在容器内启动 Flink SQL 客户端,开始交互式 SQL 操作
./bin/sql-client.sh


访问地址为:http://127.0.0.1:8081/
其它
退出 Flink SQL Client:
bash
-- 在 Flink SQL> 提示符下,输入以下命令并按 Enter 键
EXIT;
这条命令会关闭 SQL 客户端,并返回到容器内的命令行(你之前看到的 root@jobmanager:/opt/flink#)
退出 Docker 容器:
bash
-- 退出SQL客户端后,你仍处于 jobmanager 容器的内部。要完全返回到 Windows PowerShell,在容器内的命令行输入如下
exit
或者按快捷键 Ctrl + D。之后,你将回到 Windows 的命令行环境(如 PS D:\docker\flink>)
操作流程图:
