Java 不可序列化对象和函数的Spark Scala编程
当我使用运行Spark Scala程序时,出现“任务不可序列化”异常Java 不可序列化对象和函数的Spark Scala编程,java,scala,apache-spark,rdd,serializable,Java,Scala,Apache Spark,Rdd,Serializable,当我使用运行Spark Scala程序时,出现“任务不可序列化”异常 Spark RDDs属于不可序列化类型(java类) 调用的函数来自不可序列化的类(同样是java类) 我的代码是这样的 object Main{ def main(args : Array(String){ ... var rdd = sc.textFile(filename) .map(line => new NotSerializabl
- Spark RDDs属于不可序列化类型(java类)
- 调用的函数来自不可序列化的类(同样是java类)
object Main{
def main(args : Array(String){
...
var rdd = sc.textFile(filename)
.map(line => new NotSerializableJClass(line)).cache()
//rdd is RDD[NotSerializableJClass]
...
var test = new NotSerializableJPredicate()
rdd = rdd.filter(elem => test.test(elem))
//throws TaskNotSerializable on test Predicate class
}
}
我注意到我可以用
rdd = rdd.filter(elem => (new NotSerializableJPredicate()).test(elem))
但对于RDD中的对象类,我仍然得到了这个例外。我会以另一种方式,也会以另一种方式,来讨论第二部分,因为我不想创建大量的PredicateClass对象
你能帮我吗?如何继续使用非序列化类?帮助我避免任务序列化问题的一些一般规则: 如果您正在从代码中调用任何类的方法;Spark需要序列化包含该方法的整个类。方法可以是以下任意一种: a> 在NotSerializableClass中将方法声明为函数变量;因此,与其写: def foo(x:Int)={blah blah}尝试使用val foo=(x:Int)=>{blah blah} 所以spark现在不再需要序列化整个类。 b> 在某些情况下,重构代码以提取单独类中的相关部分可能是一种方法。
c> 将类中作业实际上不需要的对象标记为@transient,并将类标记为可序列化的RDD必须是可序列化的,因此不能创建不可序列化类的RDD 对于谓词,可以使用mapPartitions编写它
rdd.mapPartitions{
part =>
val test = new NotSerializableJPredicate()
part.filter{elem => test.test(elem)}
}
MapPartitions将在每个分区上运行一次,因此它允许您在executor上实例化不可序列化的类,但它只需要在每个分区上执行一次,而不是对每个记录执行一次。是
NotSerializableClass
第三方类还是应用程序中定义的类?