Scala Spark,Kryo与ProtoBuf字段的序列化问题

Scala Spark,Kryo与ProtoBuf字段的序列化问题,scala,apache-spark,kryo,Scala,Apache Spark,Kryo,在转换RDD时,运行与protobuf字段序列化相关的spark作业时,我看到一个错误 com.esotericsoftware.kryo.KryoException:java.lang.UnsupportedOperationException 序列化跟踪: 其他作者(com.thomsonreuters.kraken.medusa.dbor.proto.Book$DBBooks) 错误似乎是在这一点上创建的: val booksPerTier: Iterable[(TimeTier, RDD

在转换RDD时,运行与protobuf字段序列化相关的spark作业时,我看到一个错误

com.esotericsoftware.kryo.KryoException:java.lang.UnsupportedOperationException 序列化跟踪: 其他作者(com.thomsonreuters.kraken.medusa.dbor.proto.Book$DBBooks)

错误似乎是在这一点上创建的:

val booksPerTier: Iterable[(TimeTier, RDD[DBBooks])] = allTiers.map {
      tier => (tier, books.filter(b => isInTier(endOfInterval, tier, b) &&     !isBookPublished(o)).mapPartitions( it =>
      it.map{ord =>
        (ord.getAuthor, ord.getPublisherName, getGenre(ord.getSourceCountry))}))
}

val averagesPerAuthor = booksPerTier.flatMap { case (tier, opt) =>
  opt.map(o => (tier, o._1, PublisherCompanyComparison, o._3)).countByValue()
}

val averagesPerPublisher = booksPerTier.flatMap { case (tier, opt) =>
  opt.map(o => (tier, o._1, PublisherComparison(o._2), o._3)).countByValue()
}
该字段是protobuf中指定的列表,如下所示:

otherAuthors_ = java.util.Collections.emptyList()
正如您所见,代码实际上并未使用Protobuf一书中的字段,尽管它仍在通过网络传输


有人对此有什么建议吗?

好吧,这是一个老问题,但这是给子孙后代的答案。默认的kryo序列化程序不能很好地处理某些集合。有一个第三方库可以提供帮助:

在您的情况下,您可能需要在创建spark配置时提供自定义kryo注册器:

val conf = new SparkConf()
conf.set("spark.kryo.registrator", "MyKryoRegistrator")
在您的注册器中使用所需的自定义注册:

class MyKryoRegistrator extends KryoRegistrator {
    override def registerClasses(kryo: Kryo) {
        kryo.register( Collections.EMPTY_LIST.getClass(), new CollectionsEmptyListSerializer() );
        // Probably should use proto serializer for your proto classes
        kryo.register( Book.class, new ProtobufSerializer() );
    } 
}