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

使用Apache Spark读取S3 CSV时遇NoClassDefFoundError问题求助

问题描述

尝试用Apache Spark读取S3中的CSV文件时,触发如下错误:

java.lang.NoClassDefFoundError: software/amazon/awssdk/transfer/s3/progress/TransferListener
  at java.base/java.lang.Class.forName0(Native Method)
  at java.base/java.lang.Class.forName(Class.java:398)
  at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:2625)
  ...

当前使用的JAR包:

  • C:/spark/jars/iceberg-spark-runtime-3.5_2.12-1.7.1.jar
  • C:/spark/jars/hadoop-aws-3.4.0.jar
  • C:/spark/jars/aws-java-sdk-core-1.11.999.jar
  • C:/spark/jars/aws-java-sdk-s3-1.11.999.jar
  • C:/spark/jars/aws-sdk-core-2.17.99.jar
  • C:/spark/jars/aws-sdk-s3-2.17.99.jar

遇到的困境:

  • 仅用AWS SDK v1(aws-java-sdk-core、aws-java-sdk-s3):出现认证错误
  • 仅用AWS SDK v2(aws-sdk-core、aws-sdk-s3):触发TransferListener类缺失问题
  • 同时混用v1和v2 JAR包:仍抛出相同的NoClassDefFoundError

解决方案

1. 对齐Hadoop-AWS与AWS SDK版本

Hadoop-aws 3.4.0依赖特定版本的AWS SDK v1,混用v1和v2会直接导致类路径冲突,这是核心问题。执行以下操作:

  • 移除所有AWS SDK v2的JAR包(aws-sdk-core-2.17.99.jar、aws-sdk-s3-2.17.99.jar)
  • 将当前AWS SDK v1的1.11.999版本替换为1.12.526——这是hadoop-aws 3.4.0官方兼容的SDK v1版本

2. 修复认证错误

替换兼容版本后,认证问题可通过以下方式解决:

  • 在Spark代码中直接配置凭证:
    spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "你的ACCESS_KEY")
    spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "你的SECRET_KEY")
    
  • 如果运行在AWS EC2/EKS环境,可使用实例角色免密认证:
    spark.sparkContext.hadoopConfiguration.set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.InstanceProfileCredentialsProvider")
    
  • 也可通过本地~/.aws/credentials文件配置凭证,Spark会自动读取

3. 处理Iceberg依赖冲突

Iceberg-spark-runtime-1.7.1可能自带了AWS SDK依赖,需确保其与当前hadoop-aws、SDK版本兼容:

  • 若仍有冲突,可在构建时排除Iceberg中的AWS SDK依赖(以Maven为例):
    <dependency>
      <groupId>org.apache.iceberg</groupId>
      <artifactId>iceberg-spark-runtime-3.5_2.12</artifactId>
      <version>1.7.1</version>
      <exclusions>
        <exclusion>
          <groupId>com.amazonaws</groupId>
          <artifactId>aws-java-sdk-core</artifactId>
        </exclusion>
        <exclusion>
          <groupId>com.amazonaws</groupId>
          <artifactId>aws-java-sdk-s3</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

4. 验证类路径

启动Spark时,通过spark-shell --verbose命令查看加载的JAR列表,确认没有重复或冲突的AWS SDK依赖存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:38