【问题标题】:java.lang.IllegalAccessError: tried to access method org.apache.hadoop.metrics2.lib.MutableCounterLongjava.lang.IllegalAccessError:试图访问方法 org.apache.hadoop.metrics2.lib.MutableCounterLong
【发布时间】:2020-12-30 15:36:50
【问题描述】:

我有一个 Spark 应用程序从 hdfs 获取数据并将数据摄取到 S3。以下是我正在使用的不同组件的版本。

火花:2.3.1 Hadoop:2.7.3 斯卡拉:2.11.8

我正在使用 hadoop-aws-2.7.3.jar、hadoop-common-2.7.3.jar 和 aws-java-sdk-1.7.4.jar。 我关注了一些与 hadoop 相关的博客,还参考了 mavenrepository 站点以获取正确的 jar 组合。

这是我将文件上传到 S3 的代码

spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "<access_key>")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", "")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.impl", 
 "org.apache.hadoop.fs.s3a.S3AFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint", "<access_endpoint>")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true")
val wikipediaDataitems = spark.read.json("<some_json_file_in_hdfs>")
wikipediaDataitems.write.format("json").save("s3a://<bucket_name>/wikipedia.json")

下面是我遇到的错误

Caused by: 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:163)
at org.apache.hadoop.fs.s3a.S3AInstrumentation.streamCounter(S3AInstrumentation.java:185)
at org.apache.hadoop.fs.s3a.S3AInstrumentation.<init>(S3AInstrumentation.java:112)
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:146)

我确实经历了很多面临相同问题的 stackoverflow 问题,并尝试了 hadoop-aws 和 hadop-common 和 aws-sdk jar 的不同组合,但到目前为止没有运气。

迄今为止尝试过的组合,还提到了每个组合的相关错误:

hadoop-aws-2.7.3.jar,hadoop-common-2.7.3.jar,aws-java-sdk-1.10.6.jar

org.apache.spark.sql.execution.datasources.DataSource.planForWritingFileFormat(DataSource.scala:452)
  org.apache.spark.sql.execution.datasources.DataSource.planForWriting(DataSource.scala:548)
  org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:278)
  org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:267)
  org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:225)
 ... 49 elided
Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found

hadoop-aws-2.8.2.jar,hadoop-common-2.8.2.jar,aws-java-sdk-1.10.6.jar

java.lang.NoClassDefFoundError: com/amazonaws/AmazonClientException
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:348)
  at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:2134)

hadoop-aws-2.7.3.jar,hadoop-common-2.7.3.jar,aws-java-sdk-1.11.123.jar 引起:java.lang.ClassNotFoundException:com.amazonaws.event.ProgressListener 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 66 更多

hadoop-aws-2.7.7.jar、hadoop-aws-2.7.7.jar 和 aws-java-sdk-1.7.4.jar

Caused by: 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:163)
at org.apache.hadoop.fs.s3a.S3AInstrumentation.streamCounter(S3AInstrumentation.java:185)
at org.apache.hadoop.fs.s3a.S3AInstrumentation.<init>(S3AInstrumentation.java:112)
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:146)

谁能帮帮我

【问题讨论】:

  • 我们可以看看你的 pom(或其他)吗?这似乎是一个二进制不兼容问题。
  • 这是我的 pom org.apache.hadoophadoop-aws2.7.3org.apache.hadoophadoop-common2.7.3com.amazonaws aws-java-sdk1.7.4 我尝试过构建 jar 的差异组合,也尝试过使用 spark-shell --jars。
  • 查看 mvnrepo 以了解需要什么。您的第一条错误消息是“hadoop-common 和 hadoop-aws”不同步;第二个是“hadoop-aws 和 aws-s3-sdk 不同步”。 :mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws

标签: apache-spark hadoop amazon-s3 hdfs aws-sdk


【解决方案1】:

我在本地尝试时遇到了同样的问题。这是因为您的 pom 中的指定版本之间存在冲突和不兼容问题,来自各种依赖项。

以下内容应该适用于带有 Scala 2.11 的 Spark 2.4.5

org.apache.hadoop:hadoop-aws:2.8.5
com.amazonaws:aws-java-sdk:1.11.659
org.apache.hadoop:hadoop-common:2.8.5

如果您想查看本地 spark-shell,建议使用 Hadoop Free build https://spark.apache.org/docs/2.4.0/hadoop-provided.html

有关在本地设置环境以使用 spark-shell 进行测试的说明,请参阅下面的 stackoverflow thread。

Hadoop 2.9.2, Spark 2.4.0 access AWS s3a bucket

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 2016-05-31
    • 1970-01-01
    • 2014-07-20
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多