Spark 3.1.2与Hadoop 3.2.1、AWS Hadoop依赖兼容性问题求助
Spark 3.1.2 + S3 依赖兼容性问题解决方案
问题核心原因
你遇到的java.lang.NoClassDefFoundError: org/apache/hadoop/fs/statistics/IOStatisticsSource,本质是Hadoop版本冲突:hadoop-aws:3.3.1依赖的Hadoop核心组件版本是3.3.1,但你显式指定了hadoop-common:3.2.1和hadoop-hdfs:3.2.1,而IOStatisticsSource类是Hadoop 3.3.x版本新增的,3.2.1中不存在该类,导致运行时类加载失败。
1. Spark 3.1.2兼容的Hadoop及AWS依赖版本
Spark 3.1.2官方默认绑定Hadoop 3.2.1,推荐使用同大版本的Hadoop 3.2.x系列(避免跨大版本引入兼容性问题)。对应AWS相关依赖规则:
hadoop-aws版本必须和Hadoop核心组件版本完全一致:比如用Hadoop 3.2.1,hadoop-aws也得用3.2.1- AWS SDK for Java 1.x推荐用1.11.x系列(Spark 3.1.2绑定的Hadoop 3.2.1依赖的AWS SDK版本是1.11.1020,高版本1.12.x可能引发不兼容问题)
2. 当前依赖的版本冲突分析
你的pom里明确存在两处冲突:
hadoop-aws:3.3.1依赖Hadoop 3.3.1核心包,但手动指定的hadoop-common:3.2.1和hadoop-hdfs:3.2.1会让依赖树中同时存在两个版本的Hadoop核心类,导致类缺失- AWS SDK用了1.12.604,和Hadoop 3.2.1依赖的1.11.x版本不兼容,可能引发其他潜在异常
3. 不使用S3时是否需要移除hadoop-aws?
是的,必须移除。hadoop-aws是专门适配S3文件系统的模块,不使用S3的话,保留它会引入不必要的依赖,甚至可能和其他Hadoop组件产生冲突。
修正后的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.poc</groupId> <artifactId>delta-lake</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>delta-lake</name> <url>http://maven.apache.org</url> <properties> <java.version>1.8</java.version> <scala.version>2.12</scala.version> <spark.version>3.1.2</spark.version> <delta.version>1.0.0</delta.version> <hadoop.version>3.2.1</hadoop.version> <!-- 统一Hadoop版本 --> <aws.sdk.version>1.11.1020</aws.sdk.version> <!-- 和Hadoop 3.2.1兼容的版本 --> </properties> <dependencies> <!-- Spark dependencies --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scala.version}</artifactId> <version>${spark.version}</version> <!-- 排除Spark自带的Hadoop依赖,避免冲突 --> <exclusions> <exclusion> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client-runtime</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.version}</artifactId> <version>${spark.version}</version> </dependency> <!-- Delta Lake dependencies --> <dependency> <groupId>io.delta</groupId> <artifactId>delta-core_2.12</artifactId> <version>${delta.version}</version> </dependency> <!-- Hadoop 统一依赖 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <!-- Hadoop AWS 必须和Hadoop版本一致 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-aws</artifactId> <version>${hadoop.version}</version> </dependency> <!-- AWS SDK 兼容版本 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>${aws.sdk.version}</version> <!-- 排除重复依赖 --> <exclusions> <exclusion> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-core</artifactId> <version>${aws.sdk.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <!-- 解决类冲突,指定主类(替换成你的主类全路径) --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>your.main.class.path</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
额外解决建议
- 运行
mvn dependency:tree查看依赖树,确认没有Hadoop版本冲突 - 本地运行Spark时,确保Spark安装包的Hadoop版本和pom中指定的一致,或通过
--jars参数指定打包好的依赖jar - Delta 1.0.0和Spark 3.1.2兼容,无需调整版本
内容的提问来源于stack exchange,提问作者agaonsindhe
相关产品推荐
相关产品推荐

