gpt4 book ai didi

java - Apache Spark : Classloader cannot find classDef in the jar

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:21 24 4
gpt4 key购买 nike

我正在 Apache Spark 中以本地模式运行一项作业,该作业会将其结果保存到 s3a 文件系统。由于 Hadoop 2.6 没有 s3a://实现(或 s3://、s3n://)。我打包了一个 uber jar,其中包含 hadoop-aws 2.6.0 的所有传递依赖项,并将其与我的主要工作的 jar 一起提交。

但是,当我使用以下简约代码对其进行测试时:

sc.parallelize(1 to 100).saveAsTextFile("s3a://***/test10/")

编译器在我第一次运行时给了我这个错误:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at com.amazonaws.auth.AWSCredentialsProviderChain.<clinit>(AWSCredentialsProviderChain.java:41)
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:112)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
at org.apache.spark.SparkHadoopWriter$.createPathFromString(SparkHadoopWriter.scala:170)
at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:953)
at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:863)
at org.apache.spark.rdd.RDD.saveAsTextFile(RDD.scala:1290)

如果我再次尝试运行,它给了我这个错误:

java.lang.NoClassDefFoundError: Could not initialize class com.amazonaws.auth.AWSCredentialsProviderChain
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:112)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
at org.apache.spark.SparkHadoopWriter$.createPathFromString(SparkHadoopWriter.scala:170)
at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:953)
at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:863)
at org.apache.spark.rdd.RDD.saveAsTextFile(RDD.scala:1290)

奇怪的是:LogFactory 和 AWSCredentialsProviderChain 都在我提到的 uber jar 中。我还检查了其他 jar,包括 workers 上的 spark 库和我的主要工作的 jar(已经部署到 spark/worker 目录),并且可以确认它们都没有同名的类。所以它不可能是 jar hell 问题(此外,在那种情况下抛出的错误应该是 Property/MethodNotFoundError)。您知道可能发生了什么以及如何解决它吗?

最佳答案

我之前遇到过类似的问题,我的解决方案是在运行 spark-submit 时将 uber jar 本身添加到 --driver-class-path。你的 uber-jar 不是由 JVM 直接执行的。相反,它由 Spark 的某种驱动程序包装器运行。将 uber jar 添加到驱动程序的类路径似乎是不必要的,但有时可以解决一些奇怪的 NoClassDefFoundError。我不确定它是否可以解决您的问题,但值得一试。

关于java - Apache Spark : Classloader cannot find classDef in the jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30426245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com