【发布时间】:2016-09-02 21:30:16
【问题描述】:
我正在尝试使用 spark cassandra 连接器利用 Cassandra 数据库中的一些数据,但我遇到了这个错误:
org.apache.spark.SparkException: Task not serializable
.
.
Caused by: java.io.NotSerializableException: org.apache.spark.SparkConf
您可以在下面看到我的代码,我正在使用 spark-shell 进行实验
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的一个实例,它是不可序列化的。 -
是否还有其他选择,因为 Obj1 方法 2/3 是用纯 Java 编写的,没有任何参考 SparkContext...
-
恐怕问题出在其中之一,因为您的
map函数中没有其他引用。我猜问题出在Obj1,因为函数应该是可序列化的。您可以尝试使用mixin,即val rdd4 = rdd3.map(x=>method2(x,new Obj1(x.method3()) with Serializable )) -
有时你也会在 shell 中得到奇怪的链接。事物可能成为您不想要的功能对象图的一部分。通常 spark-shell 很擅长清理这些,但有时你仍然会遇到问题。
标签: scala apache-spark cassandra spark-cassandra-connector