我正在使用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)
我正在将RDD与Spark Streaming一起使用。
答案 0 :(得分:0)
我做错什么了吗?有什么办法知道它是否使用Kryo?
您确实在使用kryo,它可以正确地序列化对象。
如果设置了标志:
conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrator","com.orange.iris.common.serializer.CustomKryoRegistrator")
那么它肯定会使用Kryo序列化器。另外,由于包含了标记:
conf.set("spark.kryo.registrationRequired", "true")
如果尝试序列化未注册的类,它将失败(有关更多信息,请参见此answer)。
您有多少内存? 如果使用Java和Kryo序列化您的大小大致相同,并且坚持使用MEMORY_ONLY_SER,则即使使用Kryo和Spark重新计算不适合运行的部分,分区仍可能无法容纳在内存中。这将导致大小相同。
有两种方法可以找到答案,可以运行作业并将其持久保存到MEMORY_AND_DISK_SER,然后在使用Kryo时检查磁盘是否溢出。有关存储级别的更多信息,请参见here
答案 1 :(得分:0)
检查是否已缓存数据帧(DF) 只需通过调用操作df.show触发缓存,并检查http://localhost:4040/storage上的spark UI以查看DF是否已缓存。您应该在那里看到。
您还可以使用queryExecution或进行解释以查看InMemoryRelation
this.http.get<string>('http://localhost:52008/GreenCard/AngAddUser?firstname=woohoo')
.pipe(map(res => <string> res),
catchError(this.handleError('updateUser', x)))
.subscribe(events => {this.updateUserResponse = events;});
res0:org.apache.spark.sql.catalyst.plans.logical.LogicalPlan = InMemoryRelation [id#0L],true,10000,StorageLevel(磁盘,内存,反序列化,1个副本) +-*范围(0,1,step = 1,splits = Some(8))
也请尝试使用数据集而不是DataFrame。 DataSet不使用标准的序列化方法。他们使用专门的列式存储及其自己的压缩方法,您甚至不需要使用Kryo序列化器存储数据集。