我在與使用這個簡單的例子是「ClassNotFound的」異常的問題:火花提交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
不過,如果我添加爲「驅動程序類路徑」額外的參數,和「-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
我使用星火1.0.2。 ClassToRoundTrip包含在JAR中。 我寧願不必硬編碼SPARK_CLASSPATH或SparkContext.addJar中的值。誰能幫忙?
更新 - 我已經能夠通過設置‘spark.executor.extraClassPath’,並作出解決此JAR文件在路徑上的每個執行程序的本地可用。我不明白爲什麼需要這樣做:JAR由執行程序從Spark的內部HTTP服務器提取並複製到每個執行程序的工作目錄中。 – puppet 2014-09-08 14:37:52
今天我看到同樣的問題。 Jar正在被執行程序取回,並且它有類查找,即使它拋出ClassNotFoundException!我在1.0.2 btw – nir 2014-11-06 20:40:59
再次更新 - 我認爲這可能與序列化有關。幾天前我們發現改變序列化方法使問題消失。我仍然不確定爲什麼,但值得一試。 – puppet 2014-11-08 19:46:37