2015-01-14 3 views
0

У меня есть статья классApache Spark: Удерживать пользовательский класс в GraphX: не Serializable?

case class Article(articleName:String, 
        id:Option[Long], 
        authors: Iterator[Author], 
        keywords: Iterator[String]) 

(Автор является классом, который имеет 4 варианта строк)

, и я хочу, чтобы создать график из него. Я создал RDD вершин и ребер RDD

val vertices: RDD[(VertexId, Article)] = articles.map(article => (article.id.get , article)) 

, когда я создаю мой график:

val graph = Graph(vertices, edges) 

Я получаю следующее сообщение об ошибке (укороченный):

java.io.NotSerializableException: scala.collection.LinearSeqLike$$anon$1 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) 

Я я не понимаю, почему я не могу делать то, что делаю?

ответ

2

Ваш класс не является сериализуемым, потому что LinearSeqLike в нем не является сериализуемым. Задачи, которые запускаются на узлах искрового кластера, должны быть сериализованы, чтобы попасть туда. Я бы предложил использовать List или какой-нибудь другой такой конкретный, сериализуемый тип последовательности, а не Iterator.

+0

Если я использую список, кажется, что в моем коде я теряю все хорошие возможности, которые я использую для построения своего графика, например, карты, фильтра и т. Д. Я рассмотрю обходные пути ... – Stephane

+1

Вы можете построить «Итератор», как вы сейчас это делаете, и просто выполните один «toList» в конце. (Тем не менее, я не совсем уверен, какова ваша жалоба, потому что 'List' поддерживает' map', 'filter' и т. Д.). Вам нужно фиксированное значение для отправки по кластеру, а не к ленивому вычисляемому по запросу «Итератору» по причинам, которые, мы надеемся, очевидны. (Если «авторы» и «ключевые слова» являются очень большими наборами, вы можете превратить их в «RDD's», а затем «zip» или «product» или «join» с другими RDD), а не пытаться включить их в класс случая. – lmm

Смежные вопросы