You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

搭建Flink+Iceberg+MinIO环境时遇S3AFileSystem类未找到错误

问题:Flink流式写入MinIO上Iceberg表时出现ClassNotFoundException

执行SQL语句时触发如下错误:

[ERROR] Could not execute SQL statement. Reason:
org.apache.hadoop.hive.metastore.api.MetaException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

用于构建Flink组件的Dockerfile:

FROM flink:1.16.2-scala_2.12-java11

ENV HADOOP_VERSION=3.3.2

RUN APACHE_HADOOP_URL=https://archive.apache.org/dist/hadoop/ \
    && HADOOP_VERSION=3.3.2 \
    && wget ${APACHE_HADOOP_URL}/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz \
    && tar xzvf hadoop-${HADOOP_VERSION}.tar.gz \
    && HADOOP_HOME=`pwd`/hadoop-${HADOOP_VERSION}

ENV HADOOP_CLASSPATH=/opt/flink/hadoop-${HADOOP_VERSION}/etc/hadoop:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/common/lib/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/common/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/hdfs:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/hdfs/lib/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/hdfs/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/mapreduce/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/yarn:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/yarn/lib/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/yarn/*

COPY lib/flink-sql-connector-hive-3.1.2_2.12-1.16.2.jar /opt/flink/lib/
COPY lib/flink-sql-connector-kafka-1.16.2.jar /opt/flink/lib/
COPY lib/iceberg-flink-runtime-1.16-1.3.0.jar /opt/flink/lib/
COPY lib/iceberg-hive-runtime-1.3.0.jar /opt/flink/lib/
COPY lib/hive-metastore-3.1.3.jar /opt/flink/lib/
COPY lib/hadoop-aws-3.3.2.jar /opt/flink/lib/
COPY lib/aws-java-sdk-bundle-1.11.1026.jar /opt/flink/lib/

COPY lib/flink-s3-fs-hadoop-1.16.2.jar /opt/flink/plugins/

WORKDIR /opt/flink

Docker Compose服务定义:

sqlclient:
    container_name: sqlclient
    build: flink
    command:
      - /opt/flink/bin/sql-client.sh
      - embedded
    depends_on:
      - jobmanager
    environment:
      - ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.16.2.jar
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
      - AWS_ACCESS_KEY_ID=minio
      - AWS_SECRET_ACCESS_KEY=minio123
      - AWS_REGION=us-east-1
    volumes:
      - ./flink-sql:/etc/sql

  jobmanager:
    build: flink
    hostname: "jobmanager"
    container_name: "jobmanager"
    expose:
      - "6123"
    ports:
      - "8081:8081"
    command: jobmanager
    environment:
      - ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.16.2.jar
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
      - AWS_ACCESS_KEY_ID=minio
      - AWS_SECRET_ACCESS_KEY=minio123
      - AWS_REGION=us-east-1

  taskmanager:
    build: flink
    hostname: "taskmanager"
    container_name: "taskmanager"
    expose:
      - "6121"
      - "6122"
    depends_on:
      - jobmanager
    command: taskmanager
    links:
      - jobmanager:jobmanager
    environment:
      - ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.16.2.jar
      - JOB_MANAGER_RPC_ADDRESS=jobmanager
      - AWS_ACCESS_KEY_ID=minio
      - AWS_SECRET_ACCESS_KEY=minio123
      - AWS_REGION=us-east-

解决方案

1. 修正Flink插件目录结构

Flink插件要求每个插件单独放在子目录中,否则无法被加载器识别:

# 替换原插件复制命令
RUN mkdir -p /opt/flink/plugins/s3-fs-hadoop
COPY lib/flink-s3-fs-hadoop-1.16.2.jar /opt/flink/plugins/s3-fs-hadoop/

2. 调整ClassPath传递方式

将Hadoop类路径合并到Flink的系统ClassPath中,确保进程能读取到:

# 替换原HADOOP_CLASSPATH设置
ENV FLINK_CLASSPATH=/opt/flink/hadoop-${HADOOP_VERSION}/etc/hadoop:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/common/lib/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/common/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/hdfs:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/hdfs/lib/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/hdfs/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/mapreduce/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/yarn:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/yarn/lib/*:/opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/yarn/*:${FLINK_CLASSPATH}

3. 补充Hadoop依赖到Hive Metastore可访问路径

将S3相关依赖同步到Hadoop的lib目录,确保Hive Metastore能加载到:

COPY lib/hadoop-aws-3.3.2.jar /opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/common/lib/
COPY lib/aws-java-sdk-bundle-1.11.1026.jar /opt/flink/hadoop-${HADOOP_VERSION}/share/hadoop/common/lib/

4. 修复Docker Compose配置错误

Taskmanager的AWS_REGION缺失末尾字符,修正为:

taskmanager:
  # 其他配置保持不变
  environment:
    # 其他环境变量保持不变
    - AWS_REGION=us-east-1

5. 添加Hadoop S3A配置文件

创建core-site.xml并复制到Hadoop配置目录,明确指定S3A文件系统实现:

# 在Dockerfile中添加该命令
COPY conf/core-site.xml /opt/flink/hadoop-${HADOOP_VERSION}/etc/hadoop/

core-site.xml内容示例:

<configuration>
  <property>
    <name>fs.s3a.impl</name>
    <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
  </property>
  <property>
    <name>fs.s3a.endpoint</name>
    <value>http://minio:9000</value>
  </property>
  <property>
    <name>fs.s3a.path.style.access</name>
    <value>true</value>
  </property>
</configuration>

内容的提问来源于stack exchange,提问作者danthelion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:46:04