从解析的案例类构造RDD:序列化失败

时间:2019-06-07 11:12:47

标签: scala apache-spark serialization rdd

我试图了解在自建案例类和单独对象中的解析器的情况下序列化的工作方式-我失败了。

我试图将问题归结为:

  • 将字符串解析为案例类
  • 从那些构建RDD
  • 获取第一个元素以进行打印
case class article(title: String, text: String) extends Serializable {  
  override def toString = title + s"/" + text
}

object parser {
  def parse(line: String): article = {
    val subs = "</end>"
    val i = line.indexOf(subs)
    val title = line.substring(6, i)
    val text  = line.substring(i + subs.length, line.length)
    article(title, text)
  }  
}

val text = """"<beg>Title1</end>Text 1"
"<beg>Title2</end>Text 2"
"""

val lines = text.split('\n')
val res = lines.map( line => parser.parse(line) )
val rdd = sc.parallelize(res)

rdd.take(1).map( println )

我得到

Job aborted due to stage failure: Failed to serialize task, not attempting to retry it. Exception during serialization: java.io.NotSerializableException

有天赋的Scala专家能否帮助我-只是我了解工人和主人之间的序列化交互作用-如何解决解析器/文章的交互作用以使序列化起作用?

非常感谢您。

1 个答案:

答案 0 :(得分:1)

lines.map(line => parser.parse(line)) map 函数中,调用 parser.parse 和解析器这是您的对象,不能序列化。 Spark在内部使用分区分布在整个群集中。 map 函数将在每个分区上调用。由于这些分区不在同一JVM进程上,因此每个分区上调用的函数需要可序列化,这就是为什么您的对象解析器必须遵守规则的原因。