我試圖用火花卡桑德拉連接器利用來自卡桑德拉數據庫中的一些數據,但我屬於這個錯誤:任務不可序列:由java.io.NotSerializableException org.apache.spark.SparkConf引起
org.apache.spark.SparkException: Task not serializable
.
.
Caused by: java.io.NotSerializableException: org.apache.spark.SparkConf
你可以看到我的代碼下面,我使用的火花外殼爲實驗
import com.datastax.spark.connector._, org.apache.spark.SparkContext,
org.apache.spark.SparkContext._, org.apache.spark.SparkConf
import collection.JavaConverters._
sc.stop
val conf = new SparkConf(true).set("spark.cassandra.connection.host", "xxx.xxx.xxx.xxx")
val sc = new SparkContext("local","test",conf)
val rdd = sc.cassandraTable("key", "table_name")
rdd.collect // ok
val rdd2 = rdd.where("aa > 10 and aa < 20")
rdd2.collect // ok
// method1 return an object without any link with SparkContext
val rdd3 = rdd2.map(x=> method1())
rdd3.collect // ok
// Error rise to get rdd4
val rdd4 = rdd3.map(x=>method2(x,new Obj1(x.method3())))
// If i do that it works
rdd3.collect.map(x=>method2(x,new Obj1(x.method3())))
我看了一些情況下用戶調用的方法,包括SparkContext的地圖功能裏面的參數,但是這不是我的情況。我調用方法的對象是沒有與SparkContext鏈接的對象。
我試圖收集rdd rdd2 rdd3成功,但是當我應用地圖得到rdd4我落在了錯誤上。
看起來像'method2','method3'或'Obj1'包含'SparkConf'的實例,它不是可序列化的。 – spiffman
是否有任何其他選項,因爲Obj1 method2/3是在純Java中編寫的,沒有引用SparkContext ... – KyBe
恐怕這個問題必須出現在其中一箇中,因爲'map'中沒有其他引用功能。我猜這個問題在'Obj1'中,因爲函數應該是可序列化的。你可以嘗試使用mixin,即'val rdd4 = rdd3.map(x => method2(x,new Obj1(x.method3())with Serializable))' – spiffman