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