簡體   English   中英

Spark:任務不可序列化(廣播/RDD/SparkContext)

[英]Spark: Task not serializable (Broadcast/RDD/SparkContext)

有很多關於Task is not serializable在 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 中的錯誤嗎?

我在 Hadoop/Yarn 集群上使用 Spark 1.4.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的最終值需要可序列化。 centroids是可序列化的Broadcast類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM