假设我在Spark Scala中有以下类:
class SparkComputation(i: Int, j: Int) {
def something(x: Int, y: Int) = (x + y) * i
def processRDD(data: RDD[Int]) = {
val j = this.j
val something = this.something _
data.map(something(_, j))
}
}
运行以下代码时,我得到了Task not serializable Exception
:
val s = new SparkComputation(2, 5)
val data = sc.parallelize(0 to 100)
val res = s.processRDD(data).collect
我假设发生异常是因为Spark正在尝试序列化SparkComputation实例。为了防止这种情况发生,我将我在RDD操作中使用的类成员存储在局部变量(j
和something
)中。但是,由于该方法,Spark仍尝试序列化SparkComputation
对象。无论如何都要将类方法传递给map
而不强制Spark序列化整个SparkComputation
类?我知道以下代码没有任何问题:
def processRDD(data: RDD[Int]) = {
val j = this.j
val i = this.i
data.map(x => (x + j) * i)
}
因此,存储值的类成员不会导致问题。问题在于功能。 我也尝试过以下方法但没有运气:
class SparkComputation(i: Int, j: Int) {
def processRDD(data: RDD[Int]) = {
val j = this.j
val i = this.i
def something(x: Int, y: Int) = (x + y) * i
data.map(something(_, j))
}
}
答案 0 :(得分:1)
使类可序列化:
class SparkComputation(i: Int, j: Int) extends Serializable {
def something(x: Int, y: Int) = (x + y) * i
def processRDD(data: RDD[Int]) = {
val j = this.j
val something = this.something _
data.map(something(_, j))
}
}