【问题标题】:no valid constructor on sparkspark上没有有效的构造函数
【发布时间】:2016-04-08 17:14:19
【问题描述】:

这是我的代码:

class FNNode(val name: String)

case class Ingredient(override val name: String, category: String) extends FNNode(name)


val ingredients: RDD[(VertexId, FNNode)] = 
sc.textFile(PATH+"ingr_info.tsv").
      filter(! _.startsWith("#")).
      map(line => line.split('\t')).
      map(x => (x(0).toInt ,Ingredient(x(1), x(2))))

当我定义这些变量时没有错误。但是,当尝试执行它时:

ingredients.take(1)

我明白了

org.apache.spark.SparkException: Job aborted due to stage failure: Exception while getting task result: java.io.InvalidClassException: $iwC$$iwC$Ingredient; no valid constructor
    at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1431)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1419)

根据答案here,这似乎与序列化问题有关。但是,如果确实是序列化问题,我不知道如何解决。

我按照他们的方式遵循this 书中的代码,所以我认为这至少应该在某个时候起作用?

【问题讨论】:

  • FNNode 也必须是一个案例类,除非我认为。
  • 不幸的是,我得到这个:“错误:案例类成分有案例祖先$iwC.$iwC.FNNode,但禁止逐个继承。为了克服这个限制,使用提取器来模式在非叶节点上匹配”
  • 你可以试试,让FNNode扩展Serializable是否有帮助?
  • 这段代码对我来说实际上工作得很好(在本地模式下):/
  • @TzachZohar 这些序列化错误永远不会在本地模式下发生(不幸的是......),因为类不需要通过网络发送,因此根本不需要序列化。

标签: scala apache-spark spark-graphx


【解决方案1】:

这为我解决了您的问题:

class FNNode(val name: String) extends Serializable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多