簡體   English   中英

java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V

[英]java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.reloadExistingConfigurations()V

看起來我再次陷入使用 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>

以下是從 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 應該擁有所有這些。

任何幫助將不勝感激。

hadoop 和 AWS JDK 之間的依賴關系非常敏感,您應該堅持使用構建 hadoop 依賴版本的正確版本。

您需要解決的第一個問題是選擇一個版本的 Hadoop。 我看到您正在混合版本2.8.32.8.0

當我查看org.apache.hadoop:hadoop-aws:2.8.0的依賴關系樹時,我看到它是針對 AWS SDK 的1.10.6版構建的(對於hadoop-aws:2.8.3 )。

Maven 依賴樹

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

  • 選擇您要使用的 hadoop 版本
  • hadoop-aws包含在與您的 hadoop 兼容的版本中
  • 刪除其他依賴項,或僅包含與您的 hadoop 版本兼容的版本匹配的依賴項。

萬一其他人仍然在這個錯誤上絆倒......我花了一段時間才發現,但請檢查您的項目是否對包org.apache.avro/avro-tools有依賴(直接或可傳遞)。 它是通過傳遞依賴項帶入我的代碼中的。 它的問題在於它附帶了一份org.apache.hadoop.conf.Configuration的副本,該副本比 hadoop 的所有當前版本都要舊得多,因此它可能最終成為類路徑中的那個。

在我的 scala 項目中,我只需要將它排除在外

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

並且錯誤(終於!)消失了。

我確信 avro-tools 編碼器有充分的理由包含屬於另一個包 (hadoop-common) 的文件副本,我真的很驚訝在那里找到它,讓我浪費了一整天。

就我而言,我在 Cloudera 邊緣節點上運行本地 Spark 安裝並遇到此沖突(即使我確保下載帶有預編譯的正確 hadoop 二進制文件的 Spark)。 我剛剛進入我的 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

在那之后,它無論如何都以本地模式運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM