我正在学习Apache Spark,并试图清除与Spark中缓存和持久化RDD相关的概念。
所以根据“学习星火”一书中的持久性文档:
为避免多次计算RDD,我们可以要求Spark保留数据。 当我们要求Spark持久化RDD时,计算RDD的节点会存储它们的分区。 Spark根据我们的目标有多种持久性可供选择。
在Scala和Java中,默认的persist()会 将数据作为未序列化的对象存储在JVM堆中。在Python中,我们总是序列化 持久存储的数据,因此默认值存储在JVM堆中作为pickle 对象。当我们将数据写入磁盘或堆外存储时,该数据也始终如此 序列化。
但是为什么 - 默认的persist()会 将数据作为未序列化的对象存储在JVM堆中。
答案 0 :(得分:3)
因为没有序列化和反序列化开销使其成本低,并且可以在没有额外内存的情况下加载缓存数据。 SerDe昂贵且显着增加了总体成本。保持序列化和反序列化的对象(特别是标准的Java序列化)可以在最坏的情况下使内存使用量增加一倍。