2016-09-01 39 views
1

我試圖用火花卡桑德拉連接器利用來自卡桑德拉數據庫中的一些數據,但我屬於這個錯誤:任務不可序列:由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我落在了錯誤上。

+2

看起來像'method2','method3'或'Obj1'包含'SparkConf'的實例,它不是可序列化的。 – spiffman

+0

是否有任何其他選項,因爲Obj1 method2/3是在純Java中編寫的,沒有引用SparkContext ... – KyBe

+1

恐怕這個問題必須出現在其中一箇中,因爲'map'中沒有其他引用功能。我猜這個問題在'Obj1'中,因爲函數應該是可序列化的。你可以嘗試使用mixin,即'val rdd4 = rdd3.map(x => method2(x,new Obj1(x.method3())with Serializable))' – spiffman

回答

0

我有這個錯誤,並通過刪除行val sc = new SparkContext解決,因爲我使用Apache Zeppelin,它默認提供一個sc

嘗試將sc.stop置於代碼末尾。

0

我終於解決了這個問題,實際上我有方法2的參數在本地聲明。

val v1 = Set[Double].empty.asJava 
val v2 = java.lang.Boolean.TRUE 

我剛剛播出這個值,所有作品都像一個魅力。 感謝您的建議

相關問題