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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:03:16