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

标签 java scala apache-spark classloader

我正在 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/

相关文章:

python - Spark 1.5.2 + Hadoop 2.6.2 spark-submit 和 pyspark 不使用独立的所有节点

java - "Exception in thread "main "java.lang.NullPointerException"运行网页抓取程序时出错

java - 字符串连接在这里如何工作?

scala - 如何在 Play Framework (2.4.x) 中干净地处理 url 中的 api 版本?

scala - 玩!斯卡拉 2.5 : testing classes injecting cache leads to an error

scala - 线程 "main"java.lang.NoSuchFieldError : BROTLI 中出现异常

java - 将自定义配置器与 WebSockets 结合使用

java - ComponentAdapter 中 componentResized 方法的任何替代方法

由于构建路径不正确,Java/Scala 导入无法正常工作?

hadoop - 如何使用 Spark 编写 avro 文件?