【问题标题】:Spark: Task not serializable (Broadcast/RDD/SparkContext)Spark:任务不可序列化(广播/RDD/SparkContext)
【发布时间】:2015-08-28 09:59:57
【问题描述】:

Spark 中有很多关于Task is not serializable 的问题。但是,这个案例似乎很特殊。

我已经创建了一个类:

class Neighbours(e: RDD[E], m: KMeansModel) extends Serializable {
  val allEs: RDD[(String, E)] = e.map(e => (e.w, e))
    .persist()
  val sc = allEs.sparkContext
  val centroids = sc.broadcast(m.clusterCenters)
  [...]

该类定义了以下方法:

private def centroidDistances(v: Vector): Array[Double] = {
  centroids.value.map(c => (centroids.value.indexOf(c), Vectors.sqdist(v, c)))
    .sortBy(_._1)
    .map(_._2)
}

但是,当调用该类时,会抛出 Task is not serializable 异常。

很奇怪,Neighbours 类的标题中的微小变化就足以解决问题。我没有创建 val sc: SparkContext 用于广播,而是内联创建 Spark 上下文的代码:

class Neighbours(e: RDD[E], m: KMeansModel) extends Serializable {
  val allEs: RDD[(String, E)] = e.map(e => (e.w, e))
  .setName("embeddings")
  .persist()
  val centroids = allEmbeddings.sparkContext(m.clusterCenters)
  [...]

我的问题是:第二个变体有何不同?第一个出了什么问题?直觉上,这应该只是语法糖,这是 Spark 的 bug 吗?

我在 Hadoop/Yarn 集群上使用 Spark 1.4.1。

【问题讨论】:

    标签: scala serialization apache-spark hadoop-yarn


    【解决方案1】:

    当你定义时

    class Neighbours(e: RDD[E], m: KMeansModel) extends Serializable {
      ...
      val sc = allEmbeddings.sparkContext
      val centroids = sc.broadcast(m.clusterCenters)
      ...
    }
    

    您已将sc 设置为类变量,这意味着可以从Neighbours 的实例访问它,例如neighbours.sc。这意味着sc 需要可序列化,事实并非如此。

    当你内联代码时,只有centroids的最终值需要可序列化。 centroidsBroadcast 类型,它是可序列化的。

    【讨论】:

    • 感谢您阐明这一点。我假设sc 会变得可序列化,因为它是一个类变量。有没有办法定义 sc 以便它实际上是可序列化的?
    • 我不知道有一种方法可以改变提供的类的可序列化性,但我也不确定传递你的 spark 上下文是否在 Spark 中是一件有效的事情。既然你可以从你的 RDD 得到它,你需要序列化上下文吗?
    • 其实不是。这条评论只是关于简洁的代码;如果 SparkContext 在其他地方使用,将其存储在一个变量中似乎比从 RDD 再次检索它更干净。但是,您可能是对的,将 sc 作为变量传递将是一个更好的选择(如果这就是您的意思)。
    • 如果您希望能够在代码中简洁地使用sc,您可以将其定义为指向allEmbeddings.sparkContextdef 而不是val?我希望这不会导致任何序列化问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2018-04-06
    • 2021-03-16
    • 1970-01-01
    • 2016-02-07
    • 2015-12-16
    • 2017-03-21
    相关资源
    最近更新 更多