Scala IllegalArgumentException:无法序列化类

时间:2016-04-27 16:57:00

标签: scala serialization apache-spark kryo

我有一个非常简单的课程,我正在努力减少使用火花。 由于某种原因,它不断抛出异常无法序列化类。 这是我的班级:

@SerialVersionUID(1000L)
class TimeRange(val  start: Long, val end: Long) extends Serializable {

  def this(){
    this(0,0)
  }

  def mergeOverlapping(rangesSet : Set[TimeRange]) = {
    def minMax(t1: TimeRange, t2: TimeRange) : TimeRange = {
      new TimeRange(if(t1.start < t2.start) t1.start else t2.start, if(t1.end > t2.end) t1.end else t2.end)
    }
    (rangesSet ++ Set(this)).reduce(minMax)
  }


  def containsSlice(timeRange: TimeRange): Boolean ={
    (start < timeRange.start && end > timeRange.start) ||
      (start > timeRange.start && start < timeRange.end)
  }

  override def toString = {
    "("+ start + ", " + end + ")"
  }
}

我也尝试过使用@SerialVersionUID(2L)和Kryo​​:

conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.registerKryoClasses(Array(classOf[TimeRange], classOf[Set[TimeRange]]))

我正在使用Scala 2.11和Spark 1.6.1。

编辑: 使用相同的mapper和reducer但不使用类TimeRange使用(Long,Long)工作。

 def mergeOverlapping(currRange : (Long, Long), rangesSet : Set[(Long, Long)]) = {
     def minMax(t1: (Long, Long), t2: (Long, Long)) : (Long, Long) = {
       (if(t1._1 < t2._1) t1._1 else t2._1, if(t1._2 > t2._2) t1._2 else t2._2)
     }
     (rangesSet ++ Set(currRange)).reduce(minMax)
   }

    def containsSlice(t1: (Long, Long), t2 : (Long, Long)): Boolean ={
      (t1._1 < t2._1 && t1._2 > t2._1) ||
        (t1._1 > t2._1 && t1._1 < t2._2)
    }

1 个答案:

答案 0 :(得分:1)

我认为这个类可以序列化,但是当你在Spark中使用它时,你必须确保闭包集中的所有变量都是可序列化的。我在学习Spark的过程中遇到过这种问题,而且大部分时间都是由于涉及另一个不可序列化到闭包中的变量(map或reduce方法中的代码)引起的。如果您可以显示代码如何使用此类,那可能会有所帮助。