2016-09-01 21 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 

我刚刚播出这个值,所有作品都像一个魅力。 感谢您的建议

相关问题