【问题标题】:java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()Vjava.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V
【发布时间】:2018-08-15 22:48:49
【问题描述】:

看起来我再次被困在使用 spark submit 运行打包的 spark 应用程序 jar 上。以下是我的 pom 文件:

<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/maven-v4_0_0.xsd">
    <parent>
        <artifactId>oneview-forecaster</artifactId>
        <groupId>com.dataxu.oneview.forecast</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>forecaster</artifactId>

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-scala_${scala.binary.version}</artifactId>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>${scala.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_${scala.binary.version}</artifactId>
        <version>${spark.version}</version>
        <!--<scope>provided</scope>-->
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_2.11</artifactId>
        <version>2.2.0</version>
        <!--<scope>provided</scope>-->
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-aws</artifactId>
        <version>2.8.3</version>
        <!--<scope>provided</scope>-->
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.10.60</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.9</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.8.0</version>
        <!--<scope>provided</scope>-->
    </dependency>
</dependencies>

<build>
    <sourceDirectory>src/main/scala</sourceDirectory>
    <testSourceDirectory>src/test/scala</testSourceDirectory>
    <plugins>
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version>${scala-maven-plugin.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.dataxu.oneview.forecaster.App</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

以下是一个简单的 sn-p 代码,它从 s3 位置获取数据并打印出来:

def getS3Data(path: String): Map[String, Any] = {
    println("spark session start.........")
    val spark =  getSparkSession()

    val configTxt = spark.sparkContext.textFile(path)
        .collect().reduce(_ + _)

    val mapper = new ObjectMapper
    mapper.registerModule(DefaultScalaModule)
    mapper.readValue(configTxt, classOf[Map[String, String]])
}

当我从 intellij 运行它时,一切正常。日志很清晰,看起来不错。但是,当我使用 mvn package 打包它并尝试使用 spark submit 运行它时,我最终在.collect.reduce(_ + _) 处收到以下错误。以下是我遇到的错误:

 "main" java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V
at org.apache.hadoop.fs.s3a.S3AFileSystem.addDeprecatedKeys(S3AFileSystem.java:181)
at org.apache.hadoop.fs.s3a.S3AFileSystem.<clinit>(S3AFileSystem.java:185)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
...

我不明白哪个依赖项没有打包或者可能是什么问题,因为我确实设置了正确的版本,期望 hadoop aws 应该拥有所有这些。

任何帮助将不胜感激。

【问题讨论】:

    标签: maven hadoop apache-spark intellij-idea


    【解决方案1】:

    hadoop 和 AWS JDK 之间的依赖关系非常敏感,您应该坚持使用构建 hadoop 依赖项版本的正确版本。

    您需要解决的第一个问题是选择 一个 版本的 Hadoop。我看到你正在混合版本 2.8.32.8.0

    当我查看 org.apache.hadoop:hadoop-aws:2.8.0 的依赖关系树时,我发现它是针对 AWS 开发工具包的 1.10.6 版本构建的(hadoop-aws:2.8.3 也是如此)。

    这可能是导致不匹配的原因(您正在混合不兼容的版本)。所以:

    • 选择您要使用的 hadoop 版本
    • 在与您的 hadoop 兼容的版本中包含 hadoop-aws
    • 删除其他依赖项,或仅将它们包含在与您的 hadoop 版本兼容的版本中。

    【讨论】:

    • 我正在尝试,会尽快回复
    • 我确实删除了 hadoop-common 依赖项并将 hadoop 版本更改为 2.8.0 并将 aws-java-sdk 更改为 1.10.6。我正在调查另一个错误:Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.apache.hadoop.metrics2.lib.MutableCounterLong.&lt;init&gt;(Lorg/apache/hadoop/metrics2/MetricsInfo;J)V from class org.apache.hadoop.fs.s3a.S3AInstrumentation
    • 您能否使用该信息以及您的 pom 文件的更新版本更新问题?
    • 是 hadoop-aws 和 hadoop-core 库不同步;他们都需要匹配 2.8.0、2.8.3 等等。杰克逊和火花本身的版本也是如此。效果很好,但前提是您使用完全相同的数字
    【解决方案2】:

    如果其他人仍然遇到此错误...我花了一段时间才发现,但请检查您的项目是否对包 org.apache.avro/ 有依赖关系(直接或传递) avro 工具。 它是通过传递依赖引入我的代码的。 它的问题是它附带了 org.apache.hadoop.conf.Configuration 的副本 这比所有当前版本的 hadoop 都要老得多,所以它最终可能会成为类路径中的那个。

    在我的 scala 项目中,我只需要将其排除在

     ExclusionRule("org.apache.avro","avro-tools")
    

    错误(终于!)消失了。

    我确信 avro-tools 编码人员有充分的理由包含属于另一个包 (hadoop-common) 的文件的副本,我真的很惊讶在那里找到它,让我浪费了一整天。

    【讨论】:

      【解决方案3】:

      在我的例子中,我在 Cloudera 边缘节点上运行本地 Spark 安装并遇到了这个冲突(即使我确保下载 Spark 时预编译了正确的 hadoop 二进制文件)。我刚刚进入我的 Spark 家并移动了 hadoop-common jar,因此它不会被加载:

      mv ~/spark-2.4.4-bin-hadoop2.6/jars/hadoop-common-2.6.5.jar ~/spark-2.4.4-bin-hadoop2.6/jars/hadoop-common-2.6.5.jar.XXXXXX
      

      在那之后,它还是以本地模式运行。

      【讨论】:

        猜你喜欢
        • 2021-10-15
        • 2018-03-11
        • 2018-04-23
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        相关资源
        最近更新 更多