当前位置: 首页 > 知识库问答 >
问题:

Spark-submit ClassNotFound异常

任云瀚
2023-03-14

我在使用以下简单示例时遇到了“ClassNotFound”异常的问题:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

import java.net.URLClassLoader

import scala.util.Marshal

class ClassToRoundTrip(val id: Int) extends scala.Serializable {
}

object RoundTripTester {

  def test(id : Int) : ClassToRoundTrip = {

    // Get the current classpath and output. Can we see simpleapp jar?
    val cl = ClassLoader.getSystemClassLoader
    val urls = cl.asInstanceOf[URLClassLoader].getURLs
    urls.foreach(url => println("Executor classpath is:" + url.getFile))

    // Simply instantiating an instance of object and using it works fine.
    val testObj = new ClassToRoundTrip(id)
    println("testObj.id: " + testObj.id)

    val testObjBytes = Marshal.dump(testObj)
    val testObjRoundTrip = Marshal.load[ClassToRoundTrip](testObjBytes)  // <<-- ClassNotFoundException here
    testObjRoundTrip
  }
}

object SimpleApp {
  def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)

    val cl = ClassLoader.getSystemClassLoader
    val urls = cl.asInstanceOf[URLClassLoader].getURLs
    urls.foreach(url => println("Driver classpath is: " + url.getFile))

    val data = Array(1, 2, 3, 4, 5)
    val distData = sc.parallelize(data)
    distData.foreach(x=> RoundTripTester.test(x))
  }
}

在本地模式下,按照文档提交会在第31行生成一个“ClassNotFound”异常,其中ClassToRoundTrip对象被反序列化。奇怪的是,前面28行的使用还可以:

spark-submit --class "SimpleApp" \
             --master local[4] \
             target/scala-2.10/simpleapp_2.10-1.0.jar
spark-submit --class "SimpleApp" \
             --master local[4] \
             --driver-class-path /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/simpleapp_2.10-1.0.jar \
             --jars /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/SimpleApp.jar \
             target/scala-2.10/simpleapp_2.10-1.0.jar

但是,提交给本地开发人员主机仍然会产生相同的问题:

spark-submit --class "SimpleApp" \
             --master spark://localhost.localdomain:7077 \
             --driver-class-path /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/simpleapp_2.10-1.0.jar \
             --jars /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/simpleapp_2.10-1.0.jar \
             target/scala-2.10/simpleapp_2.10-1.0.jar

我可以从输出中看到JAR文件正在被执行器提取。

下面是其中一个执行程序的日志:

共有1个答案

祁绪
2023-03-14

我也有同样的问题。如果master是本地的,那么程序对大多数人来说运行良好。如果他们设置为(我也遇到过)“spark://myurl:7077”,那就不起作用了。大多数人会得到错误,因为在执行过程中找不到匿名类。它通过使用sparkcontext.addjars(“到jar的路径”)来解决。

确保你正在做以下事情:-

  • sparkcontext.addjars(“从maven[hint:mvn package]创建的jar的路径”)。
  • 我在代码中使用了sparkconf.setmaster(“spark://myURL:7077”)并在通过命令行向spark提交作业时提供了相同的参数。
  • 当您在命令行中指定类时,请确保您正在用URL写入它的完整名称。例如:“PackageName.ClassName”
  • 最终命令应该类似于bin/spark-submit--class“packageName.className”--master spark://myURL:7077 pathToYourJar/target/YourJarFromMaven.jar

注意:最后一点中的这个jar pathToYourJar/target/YourJarFromMaven.jar也在代码中设置为这个答案的第一点。

 类似资料:
  • 我正在将数据转换为数据帧,将其写入HDFS: 密码 已创建文件夹,但未写入文件。 程序因以下错误而终止: 在我的pom中,我使用了各自的依赖项: 火花-core_2.11 火花-sql_2.11 火花-streaming_2.11 火花流-kafka-0-10_2.11

  • 我正尝试使用Spark 2.0.2从hbase数据库(1.2.5)中获取数据,此页面中的代码为:https://github.com/apache/hbase/blob/master/hbase-spark/src/main/java/org/apache/hadoop/hbase/Spark/example/hbaseContext/javahbasebulkgetexample.java 但我

  • 我有一个spark jar,我正试图将其提交给我的本地spark实例。jar是这样的包:按照maven结构,所有配置文件都存在于/resources文件夹中。 以下是例外情况: 在上述异常中,可以观察到的一件事是<代码> 在jar末尾标记:

  • 我在运行代码时遇到以下异常: 线程“main”java.lang.noClassDeffounderror:org/apache/spark/logging在java.lang.ClassLoader.DefineClass1(Native Method),在java.security.secureClassLoader.DefineClass1(classLoader.java:760),在ja

  • 我正在使用这个快速入门教程,尝试使用spark submit命令运行这个简单的spark应用程序。http://spark.apache.org/docs/1.2.0/quick-start.html#self-包含的应用程序。当我尝试使用spark-1.4.0-bin-hadoop2.6\bin运行它时 有人知道如何解决这个问题吗?非常感谢任何帮助。

  • 在spark数据集中获取此空错误。滤器 输入CSV: 工作代码: 失败代码(添加以下行返回错误): 返回空错误