![](/img/trans.png)
[英]Cannot resolve task not serializable [org.apache.spark.SparkException: Task not serializable] Spark Scala RDD
[英]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.