使用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
相关产品推荐
相关产品推荐

