복붙노트

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

HADOOP

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

내가 다시 spark 제출을 사용하여 패키지 스파크 애플 리케이션 항아리를 실행에 붙어있어 보인다. 다음은 내 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가 그들 모두를 가져야한다고 기대하는 버전을 올바르게 설정했기 때문에 어떤 의존성이 패키지화되지 않았는지 이해할 수 없다.

어떤 도움을 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.hadoop과 AWS JDK 간의 의존성은 매우 민감하므로 hadoop 종속성 버전이 빌드 ​​된 올바른 버전을 사용해야합니다.

    hadoop과 AWS JDK 간의 의존성은 매우 민감하므로 hadoop 종속성 버전이 빌드 ​​된 올바른 버전을 사용해야합니다.

    해결해야 할 첫 번째 문제는 한 버전의 Hadoop을 선택하는 것입니다. 2.8.3과 2.8.0 버전을 섞어 놓고있는 것을 보았습니다.

    org.apache.hadoop : hadoop-aws : 2.8.0에 대한 종속성 트리를 보면 AWS SDK의 버전 1.10.6 (hadoop-aws : 2.8.3과 동일)에 대해 빌드 된 것을 볼 수 있습니다.

    이것은 아마도 불일치를 일으키는 원인 일 것입니다 (호환되지 않는 버전을 혼합하고 있습니다). 그래서:

  2. ==============================

    2.다른 누군가가 여전히이 오류에 걸려 넘어 졌을 때 ... 알아내는 데는 시간이 걸렸지 만, 프로젝트에 org.apache.avro / avro-tools 패키지의 종속성 (직접 또는 이행 성)이 있는지 확인하십시오. 전이 의존성에 의해 제 코드로 옮겨졌습니다. 문제는 org.apache.hadoop.conf.Configuration 사본과 함께 제공된다는 것입니다. 이것은 현재 모든 버전의 hadoop보다 훨씬 오래되었으므로 클래스 패스에서 선택되는 파일이 될 수 있습니다.

    다른 누군가가 여전히이 오류에 걸려 넘어 졌을 때 ... 알아내는 데는 시간이 걸렸지 만, 프로젝트에 org.apache.avro / avro-tools 패키지의 종속성 (직접 또는 이행 성)이 있는지 확인하십시오. 전이 의존성에 의해 제 코드로 옮겨졌습니다. 문제는 org.apache.hadoop.conf.Configuration 사본과 함께 제공된다는 것입니다. 이것은 현재 모든 버전의 hadoop보다 훨씬 오래되었으므로 클래스 패스에서 선택되는 파일이 될 수 있습니다.

    내 스칼라 프로젝트에서, 나는 그것을 단지

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

    오류 (마침내!)가 사라집니다.

    나는 avro-tools 코더들이 다른 패키지 (hadoop-common)에 속한 파일의 복사본을 포함하는 좋은 이유가 있다고 확신한다. 정말로 거기에있는 것을 발견하면 놀랐고 하루 종일 낭비하게 만들었다.

  3. from https://stackoverflow.com/questions/49158612/java-lang-nosuchmethoderror-org-apache-hadoop-conf-configuration-reloadexisting by cc-by-sa and MIT license