生产环境开箱即用的“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>)

操作流程图:

相关推荐
_运维那些事儿2 小时前
GitLabCI-CD入门
运维·ci/cd·容器·云计算·k8s·运维开发
爱技术的小伙子2 小时前
【 Docker 快速部署 MySQL 8.0(2026最新实践)—— 一键启动 + 数据持久化 + 常见优化】
mysql·adb·docker
hunter14502 小时前
docker 在centos和ubuntu的安装
linux·docker·centos
不做码农好多年,该何去何从。3 小时前
阿里云上使用docker-compose安装禅道
阿里云·docker·云计算
Clarence Liu3 小时前
k8s 1.35 使用kubeadm部署高可用集群
云原生·容器·kubernetes
boy快快长大3 小时前
Docker简单服务迁移
运维·docker·容器
危笑ioi3 小时前
docker部署jenkins/gitlab/nexus3/nginx配置端口转发与ssl
nginx·docker·gitlab·jenkins·ssl
刘某的Cloud3 小时前
docker cp 传文件,使用 docker exec 结合 tar 流传输,效率更高且能保留权限
linux·运维·docker·容器·系统
摆烂z3 小时前
k8s频繁拉取镜像导致磁盘占满imagefs
云原生·容器·kubernetes