当 Class 扩展可序列化时,Apache Spark 任务不可序列化
Apache Spark Task not Serializable when Class exends Serializable
关于 Task not Serializable
我一直有错误。
我做了一个小的 Class 并且它扩展了 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 是可序列化的;并且,Class Random
根据 API 也是可序列化的。那么,我做错了什么?我一直无法让这样的东西工作;因此,我想我的理解是错误的。我一直被告知 Class 必须是可序列化的...好吧,它仍然不起作用!?
scala.util.Random
直到 2.11.0-M2 才可序列化。
很可能您使用的是早期版本的 Scala。
A class 直到它的所有成员也都是可序列化的(或者提供了一些其他机制来序列化它们,例如 transient
或 readObject/writeObject
时才会变成可序列化的。)
当 运行 在 spark-1.3 中给出示例时,我得到以下堆栈跟踪:
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)) })
关于 Task not Serializable
我一直有错误。
我做了一个小的 Class 并且它扩展了 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 是可序列化的;并且,Class Random
根据 API 也是可序列化的。那么,我做错了什么?我一直无法让这样的东西工作;因此,我想我的理解是错误的。我一直被告知 Class 必须是可序列化的...好吧,它仍然不起作用!?
scala.util.Random
直到 2.11.0-M2 才可序列化。
很可能您使用的是早期版本的 Scala。
A class 直到它的所有成员也都是可序列化的(或者提供了一些其他机制来序列化它们,例如 transient
或 readObject/writeObject
时才会变成可序列化的。)
当 运行 在 spark-1.3 中给出示例时,我得到以下堆栈跟踪:
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)) })