gpt4 book ai didi

scala - Spark 提交 ClassNotFound 异常

转载 作者:行者123 更新时间:2023-12-03 11:56:27 25 4
gpt4 key购买 nike

使用这个简单的例子,我遇到了“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

但是,如果我为“driver-class-path”和“-jars”添加额外的参数,它在本地运行良好。
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 文件。

执行者之一的日志在这里:

标准输出: http://pastebin.com/raw.php?i=DQvvGhKm

标准错误: http://pastebin.com/raw.php?i=MPZZVa0Q

我正在使用 Spark 1.0.2。 ClassToRoundTrip 包含在 JAR 中。
我宁愿不必在 SPARK_CLASSPATH 或 SparkContext.addJar 中对值进行硬编码。任何人都可以帮忙吗?

最佳答案

我有同样的问题。如果 master 是本地的,那么对于大多数人来说程序运行良好。如果他们将其设置为(也发生在我身上)“spark://myurl:7077”,则它不起作用。大多数人会因为在执行过程中未找到匿名类而出错。它是通过使用 SparkContext.addJars ("Path to jar") 解决的。

确保您正在执行以下操作: -

  • SparkContext.addJars("从 maven 创建的 jar 路径 [提示:mvn 包]")。
  • 我在代码中使用了 SparkConf.setMaster("spark://myurl:7077") 并在通过命令行提交作业到 spark 时提供了相同的参数。
  • 在命令行中指定 class 时,请确保使用 URL 编写它的完整名称。例如:“packageName.ClassName”
  • 最终命令应如下所示
    bin/spark-submit --class "packageName.ClassName"--master spark://myurl:7077 pathToYourJar/target/yourJarFromMaven.jar

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

    关于scala - Spark 提交 ClassNotFound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688349/

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