복붙노트

[HADOOP] Spark 클러스터의 S3에서 읽기 작업을 수행하면 IllegalAccessError가 발생합니다 : MutableCounterLong [duplicate] 메소드에 액세스하려고했습니다.

HADOOP

Spark 클러스터의 S3에서 읽기 작업을 수행하면 IllegalAccessError가 발생합니다 : MutableCounterLong [duplicate] 메소드에 액세스하려고했습니다.

DC / OS에 Spark 클러스터가 있고 S3에서 읽는 Spark 작업을 실행 중입니다. 버전은 다음과 같습니다.

나는 다음을 수행함으로써 데이터를 읽었다.

`val hadoopConf = sparkSession.sparkContext.hadoopConfiguration
    hadoopConf.set("fs.s3a.endpoint", Config.awsEndpoint)
    hadoopConf.set("fs.s3a.access.key", Config.awsAccessKey)
    hadoopConf.set("fs.s3a.secret.key", Config.awsSecretKey)
    hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")

val data = sparkSession.read.parquet("s3a://" + "path/to/file")

` 내가 얻는 오류는 다음과 같습니다.

Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.apache.hadoop.metrics2.lib.MutableCounterLong.<init>(Lorg/apache/hadoop/metrics2/MetricsInfo;J)V from class org.apache.hadoop.fs.s3a.S3AInstrumentation
    at org.apache.hadoop.fs.s3a.S3AInstrumentation.streamCounter(S3AInstrumentation.java:194)
    at org.apache.hadoop.fs.s3a.S3AInstrumentation.streamCounter(S3AInstrumentation.java:215)
    at org.apache.hadoop.fs.s3a.S3AInstrumentation.<init>(S3AInstrumentation.java:138)
    at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:170)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
    at org.apache.spark.sql.execution.streaming.FileStreamSink$.hasMetadata(FileStreamSink.scala:44)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:321)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
    at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:559)
    at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:543)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:809)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:182)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:207)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

이 작업은 JAR로 클러스터에 제출하는 경우에만 실패합니다. 로컬 또는 도커 컨테이너에서 코드를 실행하면 오류가 발생하지 않고 데이터를 완벽하게 읽을 수 있습니다.

아무도 나를 도울 수 있다면 매우 감사 할 것입니다!

해결법

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

    1.이것은 Hadoop- * jars를 혼합 할 때 보게되는 스택 추적 중 하나입니다.

    이것은 Hadoop- * jars를 혼합 할 때 보게되는 스택 추적 중 하나입니다.

    S3A 문서가 말하는 것처럼

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

    2.나는 또한 완벽하게 로컬로 실행되는 spark cluster (kubernetes)에서 도커 이미지를 실행하기 위해 문제 (똑같은 예외는 아님)에 직면했습니다. 그런 다음 build.sbt 어셈블리와 hadoop verion을 변경했습니다.

    나는 또한 완벽하게 로컬로 실행되는 spark cluster (kubernetes)에서 도커 이미지를 실행하기 위해 문제 (똑같은 예외는 아님)에 직면했습니다. 그런 다음 build.sbt 어셈블리와 hadoop verion을 변경했습니다.

    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.3.0" 
    libraryDependencies += "org.apache.spark" %% "spark-sql-kafka-0-10" % "2.3.0"
    libraryDependencies += "com.databricks" %% "spark-avro" % "4.0.0"
    libraryDependencies += "com.databricks" %% "spark-csv" % "1.5.0"
    dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-core" % "2.8.9"
    dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.9"
    dependencyOverrides += "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.8.9"
    libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "3.1.1"
    libraryDependencies += "com.amazonaws" % "aws-java-sdk-s3" % "1.11.271"
    dependencyOverrides += "org.apache.hadoop" % "hadoop-hdfs" % "3.1.1"
    dependencyOverrides += "org.apache.hadoop" % "hadoop-client" % "3.1.1"
    
    assemblyMergeStrategy in assembly := {
     case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
     case m if m.toLowerCase.matches("meta-inf.*\\.sf$") => MergeStrategy.discard
     case "log4j.properties" => MergeStrategy.discard
     case m if m.toLowerCase.startsWith("meta-inf/services/") => MergeStrategy.filterDistinctLines
     case PathList("META-INF", "services", "org.apache.hadoop.fs.s3a.S3AFileSystem") => MergeStrategy.filterDistinctLines
     case "reference.conf" => MergeStrategy.concat
     case _ => MergeStrategy.first
    }
    

    그러나 이것이 당신을 위해서 또는 아닌지에 대해 확실하지는 않습니다. 동일한 코드가 aws-EKS 시스템에서 작동하지 않으므로 hadoop verion이 2.8.1 인 경우 동일한 예외가 throw됩니다. Hadoop 및 aws 버전은 로컬에서 잘 작동하므로 aws 팀에 도움을 요청하면서도 동일합니다.

  3. ==============================

    3.당신이 사용하고있는 hadoop-aws의 버전이 hadoop의 버전과 호환되지 않는 것 같습니다. hadoop-aws-2.7.3이 버전의 hadoop-aws와 aws-java-sdk-1.11.123 aws java sdk의이 버전을 사용해 볼 수 있습니까? 희망이 당신의 문제를 해결할 것입니다

    당신이 사용하고있는 hadoop-aws의 버전이 hadoop의 버전과 호환되지 않는 것 같습니다. hadoop-aws-2.7.3이 버전의 hadoop-aws와 aws-java-sdk-1.11.123 aws java sdk의이 버전을 사용해 볼 수 있습니까? 희망이 당신의 문제를 해결할 것입니다

  4. from https://stackoverflow.com/questions/51527878/spark-job-reading-from-s3-on-spark-cluster-gives-illegalaccesserror-tried-to-ac by cc-by-sa and MIT license