【问题标题】:Spark job reading from S3 on Spark cluster gives IllegalAccessError: tried to access method MutableCounterLong [duplicate]从 Spark 集群上的 S3 读取的 Spark 作业给出 IllegalAccessError:试图访问方法 MutableCounterLong [重复]
【发布时间】:2018-07-25 21:24:42
【问题描述】:

我在 DC/OS 上有一个 Spark 集群,我正在运行一个从 S3 读取的 Spark 作业。版本如下:

  • Spark 2.3.1
  • Hadoop 2.7
  • AWS 连接的依赖关系:“org.apache.hadoop”%“hadoop-aws”%“3.0.0-alpha2”

我通过执行以下操作读取数据:

`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 提交到集群时,此作业才会失败。如果我在本地或在 docker 容器中运行代码,它不会失败并且完全能够读取数据。

如果有人能帮我解决这个问题,我将不胜感激!

【问题讨论】:

  • 您解决了这个问题吗?我也面临同样的错误

标签: amazon-web-services apache-spark hadoop amazon-s3


【解决方案1】:

这是您在混合 Hadoop-* jar 时看到的堆栈跟踪之一。

作为S3A docs say

关键:不要尝试“插入”比构建 Hadoop 版本的新版本的 AWS 开发工具包无论您遇到什么问题,更改 AWS 开发工具包版本都不会解决问题,只会更改您的堆栈跟踪见。

随机更改 hadoop- 和 aws- JAR 以希望让问题“消失”或获得您想要的功能,不会导致您想要的结果。

【讨论】:

    【解决方案2】:

    我也遇到了问题(不完全相同的例外)在 spark 集群(kubernetes)上运行 docker 镜像,该集群在本地完美运行。然后我更改了 build.sbt 程序集和 hadoop 版本。

    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 版本为 2.8.1,则会引发相同的异常。 Hadoop 和 aws 版本也一样,在本地工作正常,所以尝试联系 aws 团队寻求帮助。

    【讨论】:

    • 你找到正确的组合了吗?
    【解决方案3】:

    您使用的 hadoop-aws 版本似乎与 hadoop 版本不兼容。你能试试hadoop-aws-2.7.3这个版本的hadoop-aws和aws-java-sdk-1.11.123这个版本的aws java sdk。希望这能解决你的问题

    【讨论】:

    • 您不能将 hadoop-aws 2.7.x 与任何 aws 1.11 版本一起使用; AWS API 变化太大。
    • @SteveLoughran 我建议使用正确的 aws 版本并要求使用。我用过,效果很好
    • 我建议 hadoop-aws-2.7.x 是针对 AWS-SDK 1.7.4 构建的; Hadoop 2.8 是 1.10。我记得,我们只在 Hadoop 2.9 jira.apache.org/jira/browse/HADOOP-13050 中切换到 1.11。如果您使用过它并且它可以工作,那么您还没有尝试运行 hadoop-aws 集成测试。
    • 我没有对 aws-java-sdk 的版本做太多测试,但是您对版本兼容的建议以及您在此处的讨论帮助我找到了可以解决问题的版本。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2018-05-12
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多