【发布时间】:2018-08-10 14:31:15
【问题描述】:
我在 Spark 中使用缓存。现在,我使用了几个缓存,其中一些在内存中约为 20gb。我首先尝试了 cache() ,后来又尝试了 persist 和 MEMORY_SER ,大小很大,所以我改为 java 序列化,其中一些得到了大约 20gb。 现在,我想使用 Kryo,我已经注册了类并且我没有收到任何错误,但是它的大小与我在大多数缓存中使用 Kryo 执行它时的大小相同。
我想缓存的一些对象是这样的:
case class ObjectToCache(id: Option[Long],
listObject1: Iterable[ObjectEnriched],
mp1: Map[String, ObjectEnriched2],
mp2: Map[String, ObjectEnriched3],
mp3: Map[String, ObjectEnriched4])
我在 Kryo 注册为:
kryo.register(classOf[Iterable[ObjectEnriched2]])
kryo.register(classOf[Map[String,ObjectEnriched3]])
kryo.register(classOf[Map[String,ObjectEnriched4]])
kryo.register(ObjectEnriched)
kryo.register(ObjectEnriche2)
kryo.register(ObjectEnriched3)
kryo.register(ObjectEnriched4)
我做错了吗?有什么方法可以知道它是否使用 Kryo? 我认为它正在使用,因为在某些时候我收到了一个错误,因为我没有剩余空间:
Serialization trace:
mp1 (ObjectEnriched)
at com.esotericsoftware.kryo.io.Output.flush(Output.java:183)
at com.twitter.chill.Tuple2Serializer.write(TupleSerializers.scala:37)
at com.twitter.chill.Tuple2Serializer.write(TupleSerializers.scala:33)
我正在使用带有 Spark Streaming 的 RDD。
【问题讨论】:
-
请显示你做序列化的代码
-
哪个代码?我猜你只需要在 Spark 中启用标志,告诉它类,当它要缓存时,它将使用 Kryo。 conf.set("spark.kryo.registrationRequired", "true") conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer") conf.set("spark.kryo.registrator", "com.orange.iris.common.serializer.CustomKryoRegistrator")
标签: apache-spark kryo