生产环境开箱即用的“Flink + Iceberg 数据湖容器搭建”(Docker)

说明:生产环境预制的、开箱即用的"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

下一步需要:

  1. 整理你的JAR包:确保 iceberg-flink-runtime-1.19-1.10.1.jar 和 hadoop-common-3.3.6.jar 都直接放在 D:\Docker\jar 目录下,或者在其子目录中。Flink的类加载器会递归扫描 lib/ 下的所有JAR。目录结构与类加载原理如下图:
  1. 重启服务

    bash 复制代码
    cd D:\Docker\flink
    docker-compose down
    docker-compose up -d
  2. 验证:进入容器查看文件是否挂载成功。

    bash 复制代码
    docker 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/

其它

bash 复制代码
-- 在 Flink SQL> 提示符下,输入以下命令并按 Enter 键

EXIT;

这条命令会关闭 SQL 客户端,并返回到容器内的命令行(你之前看到的 root@jobmanager:/opt/flink#)

退出 Docker 容器:

bash 复制代码
-- 退出SQL客户端后,你仍处于 jobmanager 容器的内部。要完全返回到 Windows PowerShell,在容器内的命令行输入如下

exit

或者按快捷键 Ctrl + D。之后,你将回到 Windows 的命令行环境(如 PS D:\docker\flink>)

操作流程图:

相关推荐
运维全栈笔记9 小时前
K8S部署Redis高可用全攻略:1主2从3哨兵架构实战
redis·docker·云原生·容器·架构·kubernetes·bootstrap
SCBAiotAigc11 小时前
2026.5.1:`DockerDesktop must be owned by an elevated account`错误的解决办法
人工智能·docker·具身智能
AI木马人11 小时前
9.人工智能实战:GPU 服务如何上 Kubernetes?从单机部署到 K8s + NVIDIA Device Plugin + HPA 的生产级改造
人工智能·容器·kubernetes
身如柳絮随风扬18 小时前
使用 Docker 部署禅道并实现自动化部署——从项目搭建到运维自动化的完整指南
运维·docker·自动化
eRTE XFUN19 小时前
docker下搭建redis集群
redis·docker·容器
一只小bit19 小时前
Docker 存储卷:本地文件与容器内部文件建立绑定关系
运维·docker·容器
都在酒里20 小时前
在公共服务器上构建 RK3588 SDK 的纯净 Docker 方案
运维·服务器·docker
jeCA EURG20 小时前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
身如柳絮随风扬20 小时前
使用 Docker 部署 Jenkins 并实现自动化部署 —— 从零到一的 CI/CD 实践指南
docker·自动化·jenkins
就叫飞六吧20 小时前
docker快速启动sqlserver实例并自动测试shell脚本
docker·容器·sqlserver