我试图用火花卡桑德拉连接器利用来自卡桑德拉数据库中的一些数据,但我属于这个错误:任务不可序列:由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