摘自:http://blog.csdn.net/zengchen__acmer/article/details/52063908
最近一直在寫Spark 相關(guān)的項(xiàng)目, 但是以前從沒有接觸過spark 相關(guān)的東西, 只能是邊學(xué)邊用。 后面準(zhǔn)備在 這里記錄 在學(xué)習(xí)、使用spark過程中,遇到的問題 今天要記錄的問題是: 使用 spark alone 運(yùn)行模式下, 進(jìn)場遇到的問題—— Java.io.NotSerializableException
1、在哪幾種情況下, 會(huì)發(fā)生這個(gè)問題
(1)類、方法 沒有被序列化 類沒有被序列化, 代碼如下:
class GetData { def init(): Unit = { val rdd = sc.textfile(.....)
val local = rdd.map(.....) }}
object test { val s = new GetData() s.init()}
這種情況下, 就會(huì)出現(xiàn) NotSerializableException 異常, 因?yàn)樵?Scala 中, 類是不會(huì)自動(dòng)序列化, 所以需要這樣改:
class GetData extends java.io.Serializable {…..}
(2) 方法沒有被序列化在 scala 中, 盡管 函數(shù)(方法)會(huì)自動(dòng)序列化, 但是在下面那種情況, 是不會(huì)自動(dòng)序列化的
val local = rdd.map(theRow => { theRow.getString(0) })
注意上面的大括號(hào), 這種情況,scala 就不會(huì)自動(dòng) 序列化, 需要修改為
val local = rdd.map(transfrom)
def transfrom(theRow: org.apache.spark.sql.Row): String = { theRow.getString(0)}
(3)、傳入的參數(shù)有 SparkContext 這種情況下, 會(huì)出現(xiàn)著這種異常: java.io.NotSerializableException: org.apache.spark.SparkContext 原因是: SparkContext, 是不能被序列話的 所以, 這種情況下, 是不能把 SparkContext 當(dāng)成參數(shù), 進(jìn)行傳遞的
2、 org.apache.spark.SparkException: Only one SparkContext may be running in this JVM 產(chǎn)生這種情況的原因是: 在同一個(gè) driver(同一次 函數(shù)調(diào)用 或者 同一個(gè)main中) 定義了兩個(gè) sparkContext 這是不允許的, 只能定義一個(gè) sparkContext