在Spark RDD操作中使用类方法返回任务不可序列化的异常

时间:2016-11-11 03:40:14

标签: scala serialization apache-spark

假设我在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操作中使用的类成员存储在局部变量(jsomething)中。但是,由于该方法,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))
  }
}

1 个答案:

答案 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))
  }
}