СДР, созданный из проанализированного случая: сериализация не удалась - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь понять, как работает сериализация в случае самостоятельно сконструированного класса case и анализатора в отдельном объекте - и у меня не получается.

Я пытался свести проблему к:

  • разбора строки на классы дел
  • построение СДР из этих
  • берет первый элемент для его печати
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 Ответ

1 голос
/ 07 июня 2019

В вашей карте функция из lines.map (line => parser.parse (line)) вы вызываете parser.parse и анализатор это ваш объекткоторый не сериализуем.Spark внутренне использует разделы, которые распределены по кластеру.Функции map будут вызываться на каждом разделе.Поскольку разделы не находятся в одном и том же процессе JVM, функция, вызываемая в каждом разделе, должна быть сериализуемой, поэтому ваш анализатор объектов должен подчиняться правилу.

...