任务不可序列化:由java.io.NotSerializableException org.apache.spark.SparkConf引起

时间:2016-09-01 15:21:06

标签: scala apache-spark cassandra spark-cassandra-connector

我正在尝试使用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时,我会犯错误。

2 个答案:

答案 0 :(得分:0)

我遇到了这个错误并通过删除行val sc = new SparkContext来解决,因为我使用的是Apache Zeppelin,它默认提供了sc

尝试将sc.stop放在代码的末尾。

答案 1 :(得分:0)

我终于解决了这个问题,实际上我有一个在本地声明的method2的参数。

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

我只是播放这些价值观,所有作品都像魅力一样。 感谢您的建议