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

Scala 任务不可序列化:由java.io.notserializableeexception org.apache.spark.SparkConf引起,scala,apache-spark,cassandra,spark-cassandra-connector,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.con

我试图使用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())))
import com.datastax.spark.connector.\uu,org.apache.spark.SparkContext,
org.apache.spark.SparkContext.\uu,org.apache.spark.SparkConf
导入collection.JavaConverters_
sc.停止
val conf=new SparkConf(true).set(“spark.cassandra.connection.host”,“xxx.xxx.xxx.xxx”)
val sc=新SparkContext(“本地”、“测试”、配置)
val rdd=sc.cassandraTable(“键”、“表名”)
rdd.collect//ok
val rdd2=rdd,其中(“aa>10且aa<20”)
rdd2.collect//ok
//method1返回一个没有任何SparkContext链接的对象
val rdd3=rdd2.map(x=>method1())
rdd3.collect//ok
//获取rdd4时出错
val rdd4=rdd3.map(x=>method2(x,新的Obj1(x.method3()))
//如果我这样做,它会起作用
rdd3.collect.map(x=>method2(x,新的Obj1(x.method3()))
我读过一些案例,其中用户调用了方法,将SparkContext作为map函数中的参数,但这不是我的案例。我调用方法的对象是没有任何SparkContext链接的对象


我试图成功地收集rdd rdd2 rdd3,但当我应用映射来获取rdd4时,我遇到了错误。

我遇到了这个错误,并通过删除行
val sc=new SparkContext
解决了这个问题,因为我使用Apache齐柏林飞艇,它默认提供了
sc


请尝试在代码末尾放置
sc.stop

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


请尝试在代码末尾添加
sc.stop

我终于解决了这个问题,事实上我有method2的参数,这些参数是在本地声明的

val v1 = Set[Double].empty.asJava
val v2 = java.lang.Boolean.TRUE
我只是传播这些价值观,所有的工作都很有魅力。
谢谢你的建议

我终于解决了这个问题,事实上我有method2的参数,这些参数是在本地声明的

val v1 = Set[Double].empty.asJava
val v2 = java.lang.Boolean.TRUE
我只是传播这些价值观,所有的工作都很有魅力。
感谢您的建议

看起来像是
method2
method3
,或者
Obj1
包含一个
SparkConf
的实例,它是不可序列化的。还有其他选项吗,因为Obj1 method2/3是用纯Java编写的,没有任何对SparkContext的引用……我担心问题必须在其中一个,因为
映射
函数中没有其他引用。我猜问题出在
Obj1
中,因为函数应该是可序列化的。您可以尝试使用mixin,即
val rdd4=rdd3.map(x=>method2(x,可序列化的新Obj1(x.method3())))
有时您也可以在shell中获得奇怪的链接。事物可以成为你不想要的函数对象图的一部分。通常情况下,spark shell在清洁这些方面非常出色,但有时仍然会出现问题。看起来像
method2
method3
,或者
Obj1
包含
SparkConf
的实例,因为Obj1 method2/3是用纯Java编写的,没有任何对SparkContext的引用,所以有没有其他选项……我担心问题一定出在其中一个选项上,因为
map
函数中没有其他引用。我猜问题出在
Obj1
中,因为函数应该是可序列化的。您可以尝试使用mixin,即
val rdd4=rdd3.map(x=>method2(x,可序列化的新Obj1(x.method3())))
有时您也可以在shell中获得奇怪的链接。事物可以成为你不想要的函数对象图的一部分。通常情况下,火花壳在清洁这些方面非常出色,但有时您仍然会遇到问题。