java.lang.nosuchmethoderror:org.apache.hadoop.conf.configuration.reloadexistingconfigurations()v

bnl4lu3b  于 2021-06-01  发布在  Hadoop
关注(0)|答案(3)|浏览(754)

看起来我又一次被困在使用sparksmit运行打包的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包打包它并尝试使用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应该拥有所有这些版本。
任何帮助都将不胜感激。

t3irkdon

t3irkdon1#

在我的例子中,我在cloudera边缘节点上运行了一个本地spark安装,遇到了这个冲突(尽管我确保下载了正确的hadoop二进制代码的spark)。我刚走进spark的家,移动了hadoop公共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

在那之后,它跑了。。。在本地模式下。

ymdaylpp

ymdaylpp2#

hadoop和awsjdk之间的依赖关系非常敏感,您应该坚持使用hadoop依赖关系版本所使用的正确版本。
您需要解决的第一个问题是选择一个hadoop版本。我看你在混音 2.8.3 以及 2.8.0 .
当我查看依赖关系树 org.apache.hadoop:hadoop-aws:2.8.0 ,我看到它是根据 1.10.6 aws sdk的版本(适用于 hadoop-aws:2.8.3 ).

这可能是导致不匹配的原因(您混合了不兼容的版本)。所以:
选择要使用的hadoop版本
包括 hadoop-aws 与hadoop兼容的版本
删除其他依赖项,或者只包含与hadoop版本匹配的版本。

ff29svar

ff29svar3#

万一有人还在犯这个错误。。。我花了一段时间才发现,但是请检查您的项目是否对org.apache.avro/avro-tools包有依赖关系(直接的或可传递的)。它是由一个可传递的依赖关系引入到我的代码中的。它的问题是,它附带了一个org.apache.hadoop.conf.configuration的副本,该副本比所有当前版本的hadoop都旧得多,因此它可能最终成为在类路径中获取的副本。
在我的scala项目中,我只需要用

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

以及错误(最后!)消失。
我确信avro工具的编码人员有一些很好的理由来包含一个属于另一个包(hadoop common)的文件副本,我真的很惊讶地发现它在那里,让我浪费了一整天。

相关问题