【问题标题】:Spark streaming: task "predict" not serializable火花流:任务“预测”不可序列化
【发布时间】:2015-10-25 09:47:14
【问题描述】:

我正在尝试使用模型进行预测来制作火花流程序,但这样做时出现错误:任务不可序列化。

代码:

val model = sc.objectFile[DecisionTreeModel]("DecisionTreeModel").first() 
val parsedData = reducedData.map { line =>
  val arr = Array(line._2._1,line._2._2,line._2._3,line._2._4,line._2._5,line._2._6,line._2._7,line._2._8,line._2._9,line._2._10,line._2._11)
  val vector = LabeledPoint(line._2._4, Vectors.dense(arr))
  model.predict(vector.features))
}

我粘贴错误:

scala> val parsedData = reducedData.map { line =>
     |     val arr = Array(line._2._1,line._2._2,line._2._3,line._2._4,line._2._5,line._2._6,line._2._7,line._2._8,line._2._9,line._2._10,line._2._11)
     |     val vector=LabeledPoint(line._2._4, Vectors.dense(arr))
     |     model.predict(vector.features)
     | }
org.apache.spark.SparkException: Task not serializable
    at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:304)
    at org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:294)
    at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:122)
    at org.apache.spark.SparkContext.clean(SparkContext.scala:2030)
    at org.apache.spark.streaming.dstream.DStream$$anonfun$map$1.apply(DStream.scala:528)
    at org.apache.spark.streaming.dstream.DStream$$anonfun$map$1.apply(DStream.scala:528)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:147)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:108)
    at org.apache.spark.SparkContext.withScope(SparkContext.scala:709)
    at .......

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 你能打印错误堆栈吗?
  • 我刚刚粘贴了它;-) 谢谢!

标签: scala serialization apache-spark apache-spark-mllib


【解决方案1】:

参考此链接: https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/javaionotserializableexception.html

在您的情况下,“模型”在驱动程序中实例化并在映射中使用,这导致对象通过网络从驱动程序发送到执行程序,因此它应该是可序列化的。如果您无法使模型可序列化,请尝试通过在 map 中实例化模型来避免序列化。您可能还需要控制在执行程序中创建此对象的频率 - 每行一次(默认),每个任务一次(即线程)或一次每个执行者(即 jvm)。

最后,我不认为您可以拥有一个全局“模型”对象,您可以导致多个执行程序发生突变 - 以防万一您正在寻找(无论您是否需要使其可序列化或不)。欢迎就这一点发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2015-08-29
    • 2020-07-01
    • 2018-08-20
    相关资源
    最近更新 更多