搭建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
相关产品推荐
相关产品推荐

