当我尝试在
RDD[(Int,ArrayBuffer[(Int,Double)])]
输入上应用方法(ComputeDwt)时,我面临上述异常。
我什至使用 extends Serialization
选项来序列化 Spark 中的对象。这是代码片段。
input:series:RDD[(Int,ArrayBuffer[(Int,Double)])]
DWTsample extends Serialization is a class having computeDwt function.
sc: sparkContext
val kk:RDD[(Int,List[Double])]=series.map(t=>(t._1,new DWTsample().computeDwt(sc,t._2)))
Error:
org.apache.spark.SparkException: Job failed: java.io.NotSerializableException: org.apache.spark.SparkContext
org.apache.spark.SparkException: Job failed: java.io.NotSerializableException: org.apache.spark.SparkContext
at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:760)
at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:758)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:60)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:758)
at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$submitMissingTasks(DAGScheduler.scala:556)
at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$submitStage(DAGScheduler.scala:503)
at org.apache.spark.scheduler.DAGScheduler.processEvent(DAGScheduler.scala:361)
at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$run(DAGScheduler.scala:441)
at org.apache.spark.scheduler.DAGScheduler$$anon$1.run(DAGScheduler.scala:149)
有人可以建议我可能是什么问题以及应该采取什么措施来克服这个问题吗?
线路
series.map(t=>(t._1,new DWTsample().computeDwt(sc,t._2)))
引用 SparkContext (
sc
),但 SparkContext 不可序列化。 SparkContext 旨在公开在驱动程序上运行的操作;它不能被工作线程上运行的代码引用/使用。
您必须重新构建代码,以便
sc
不会在您的映射函数闭包中被引用。
我知道我参加聚会迟到了,但我发布此答案是出于对收到此错误的人的礼貌。
首先,当从 RDD 映射函数调用类内部的方法时,spark 将尝试序列化封装被调用方法的类。此结果是一个错误,因为该类包含对 SparkContext 的引用(它不是可序列化的对象)。
以下 Stack Overflow 问题概述了一般问题和一些解决方案。其中之一是为包含从映射函数调用的私有方法的类创建一个伴随对象。
问题概述: Apache Spark 映射函数 org.apache.spark.SparkException:任务不可序列化
一个可能的解决方案: 如何在 Scala 中将方法限定为静态方法?