【发布时间】: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.hadoop hadoop-aws 2.7.3 org.apache.hadoop hadoop-common 2.7.3 我尝试过构建 jar 的差异组合,也尝试过使用 spark-shell --jars。com.amazonaws aws-java-sdk 1.7.4 -
查看 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