[英]Apache Spark Task not Serializable when Class exends Serializable
我一直有关于Task not Serializable
错误。
我已经创建了一个小类,它扩展了Serializable - 当我需要序列化的值时,我认为这就是我的意思。
class SGD(filePath : String) extends Serializable {
val rdd = sc.textFile(filePath)
val mappedRDD = rdd.map(x => x.split(" ")
.slice(0,3))
.map(y => Rating(y(0).toInt, y(1).toInt, y(2).toDouble))
.cache
val RNG = new Random(1)
val factorsRDD = mappedRDD(x => (x.user, (x.product, x.rating)))
.groupByKey
.mapValues(listOfItemsAndRatings =>
Vector(Array.fill(2){RNG.nextDouble}))
}
最后一行总是导致Task not Serializable
错误。 我不明白的是:Class是Serializable; 并且,Class Random
也是根据API可序列化的。 那么,我做错了什么? 我一直无法得到这样的东西去工作; 因此,我想我的理解是错误的。 我一直被告知Class必须是Serializable ......好吧它仍然不起作用!?
scala.util.Random
直到2.11.0-M2才可序列化。
很可能您使用的是早期版本的Scala。
在所有成员都是Serializable之前,类不会变为Serializable(或者提供一些其他机制来序列化它们,例如transient
或readObject/writeObject
。)
在spark-1.3中运行给定示例时,我得到以下stacktrace:
Caused by: java.io.NotSerializableException: scala.util.Random
Serialization stack:
- object not serializable (class: scala.util.Random, value: scala.util.Random@52bbf03d)
- field (class: $iwC$$iwC$SGD, name: RNG, type: class scala.util.Random)
解决这个问题的一种方法是在mapValues中对随机变量进行实例化:
mapValues(listOfItemsAndRatings => { val RNG = new Random(1)
Vector(Array.fill(2)(RNG.nextDouble)) })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.