为什么默认的persist()会将数据作为未序列化的对象存储在JVM堆中?

时间:2017-12-08 10:27:04

标签: apache-spark caching persistence spark-streaming rdd

我正在学习Apache Spark,并试图清除与Spark中缓存和持久化RDD相关的概念。

所以根据“学习星火”一书中的持久性文档:

  

为避免多次计算RDD,我们可以要求Spark保留数据。   当我们要求Spark持久化RDD时,计算RDD的节点会存储它们的分区。   Spark根据我们的目标有多种持久性可供选择。

     

在Scala和Java中,默认的persist()会   将数据作为未序列化的对象存储在JVM堆中。在Python中,我们总是序列化   持久存储的数据,因此默认值存储在JVM堆中作为pickle   对象。当我们将数据写入磁盘或堆外存储时,该数据也始终如此   序列化。

但是为什么 - 默认的persist()会 将数据作为未序列化的对象存储在JVM堆中

1 个答案:

答案 0 :(得分:3)

因为没有序列化和反序列化开销使其成本低,并且可以在没有额外内存的情况下加载缓存数据。 SerDe昂贵且显着增加了总体成本。保持序列化和反序列化的对象(特别是标准的Java序列化)可以在最坏的情况下使内存使用量增加一倍。