복붙노트

[HADOOP] org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus에서 구아바의 StopWatch에 대한 IllegalAccessError

HADOOP

org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus에서 구아바의 StopWatch에 대한 IllegalAccessError

나는 작은 스파크 응용 프로그램을 실행하려고하는데 다음과 같은 예외가 발생합니다.

Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapreduce.lib.input.FileInputFormat
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:262)
    at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:217)
    at org.apache.spark.rdd.NewHadoopRDD.getPartitions(NewHadoopRDD.scala:95)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
    at scala.Option.getOrElse(Option.scala:120)
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
    at scala.Option.getOrElse(Option.scala:120)

관련 gradle 종속성 섹션 :

compile('org.apache.spark:spark-core_2.10:1.3.1')
compile('org.apache.hadoop:hadoop-mapreduce-client-core:2.6.2') {force = true}
compile('org.apache.hadoop:hadoop-mapreduce-client-app:2.6.2') {force = true}
compile('org.apache.hadoop:hadoop-mapreduce-client-shuffle:2.6.2') {force = true}
compile('com.google.guava:guava:19.0') { force = true }

해결법

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

    1.구아바의 StopWatch 생성자에 액세스 할 수 없으므로 hadoop : hadoop : hadoop-mapreduce-client-core 버전을 구아바의 새 버전 (17.0 - 19.0)과 함께 사용할 수 없습니다 (IllegalAccessError를 초과 함)

    구아바의 StopWatch 생성자에 액세스 할 수 없으므로 hadoop : hadoop : hadoop-mapreduce-client-core 버전을 구아바의 새 버전 (17.0 - 19.0)과 함께 사용할 수 없습니다 (IllegalAccessError를 초과 함)

    hadoop-mapreduce-client-core의 최신 버전 - 2.7.2 (위의 방법에서 구아바의 StopWatch를 사용하지 않고 오히려 org.apache.hadoop.util.StopWatch를 사용함)를 사용하여 두 가지 추가 종속성 필요한 사항 :

    compile('org.apache.hadoop:hadoop-mapreduce-client-core:2.7.2') {force = true}
    
    compile('org.apache.hadoop:hadoop-common:2.7.2') {force = true} // required for org.apache.hadoop.util.StopWatch  
    
    compile('commons-io:commons-io:2.4') {force = true} // required for org.apache.commons.io.Charsets that is used internally
    

    노트: 두 개의 org.apache.commons.io 패키지가 있습니다. commons-io : commons-io (여기에있는 우리) org.apache.commons : commons-io (이전 하나, 2007). 올바른 것을 포함 시키십시오.

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

    2.방금 구아바 버전을 19.0에서 15.0으로 변경했습니다. 현재 버전 2.2를 사용 중입니다.

    방금 구아바 버전을 19.0에서 15.0으로 변경했습니다. 현재 버전 2.2를 사용 중입니다.

    <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
          </dependency>
    
  3. ==============================

    3.IntelliJ와 Spark를 사용하여 동일한 상황을 경험했습니다.

    IntelliJ와 Spark를 사용하여 동일한 상황을 경험했습니다.

    사용할 때

    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.1"
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.3.1"
    

    com.google.guava 20.0이 다운로드되고 hadoop 클라이언트 2.6.5가 다운로드됩니다.

    가장 빠른 해결책은 구아바 라이브러리를 버전 15.0 (SBT)으로 강제 실행하는 것입니다.

    dependencyOverrides += "com.google.guava" % "guava" % "15.0"
    
  4. ==============================

    4.우리의 추가 의존성 중 하나가 Guava 14.0.1을 제거하고 18.0으로 대체했기 때문에 Spark 1.6.1에이 문제가있었습니다. Spark는 hadoop-client 2.2에 대한 기본 의존성을 가지고 있습니다. [Maven Repo] (https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10/1.6.1)를 참조하십시오.

    우리의 추가 의존성 중 하나가 Guava 14.0.1을 제거하고 18.0으로 대체했기 때문에 Spark 1.6.1에이 문제가있었습니다. Spark는 hadoop-client 2.2에 대한 기본 의존성을 가지고 있습니다. [Maven Repo] (https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.10/1.6.1)를 참조하십시오.

    그 해결책은 sbt libraryDependencies에 다음을 추가하는 것입니다 : "org.apache.hadoop"% "hadoop-client"% "2.7.2"

  5. ==============================

    5.구아바 버전 불일치가있는 것 같습니다.

    구아바 버전 불일치가있는 것 같습니다.

    귀하의 코드베이스에있는 뭔가가 Stopwatch 생성자를 호출하려고했지만 Guava 17.0에서 생성자가 제거되어 Guava 15.0에 추가 된 static factory 메소드 (createStarted () 및 createUnstarted ())가 사용되었습니다.

    정적 팩토리 메서드를 대신 사용하기 위해 생성자를 사용하려는 코드를 업데이트해야합니다.

  6. ==============================

    6.제 경우에는 guava 21.0을 추가하면 오류가 발생합니다.

    제 경우에는 guava 21.0을 추가하면 오류가 발생합니다.

     <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>21.0</version>
     </dependency>
    

    그 후 구아바 15.0을 사용하거나 위의 종속성을 제거합니다. 내 코드가 잘 작동한다.

  7. ==============================

    7.해결책

    해결책

  8. ==============================

    8.문제는 종속 라이브러리에서 비롯된 것 같습니다.

    문제는 종속 라이브러리에서 비롯된 것 같습니다.

    기본적으로 hbase 테이블에 데이터를 넣으려고 할 때 문제가 발생합니다.

    처음에 나는 org.apache.hbase hbase-client 1.1.2

    내가 당신과 비슷한 문제를 가지고 있고 나중에 org.apache.hbase hbase-shaded-client 1.1.2 이제 문제는 해결되었습니다.

  9. ==============================

    9.Spark를 미리 빌드하지 않은 채로 Spark를 다시 빌드하지 않고이 문제를 해결하려면 Apache Spark 2.3.0 (예 : 'spark-2.3.0 -bin-without-hadoop ') :

    Spark를 미리 빌드하지 않은 채로 Spark를 다시 빌드하지 않고이 문제를 해결하려면 Apache Spark 2.3.0 (예 : 'spark-2.3.0 -bin-without-hadoop ') :

    클래스 경로를 변경하여 원하는 'hadoop-mapreduce-client-core'jar 파일을 강제로 사용할 수도 있습니다 (따라서 Spark는 Spark로 배포 된 버전이 아니라 Hadoop에서 버전을 찾습니다).

  10. from https://stackoverflow.com/questions/36427291/illegalaccesserror-to-guavas-stopwatch-from-org-apache-hadoop-mapreduce-lib-inp by cc-by-sa and MIT license