为什么序列化持久化 RDD 比反序列化持久化 RDD 占用更少的内存

Dhi*_*raj 5 apache-spark rdd

我读到当 RDD 通过某种序列化(无论是默认 Java 序列化还是 Kryo 序列化之类的东西)持久保存在内存中时,它在内存中占用的空间更少。我对序列化的理解是,它只是将内存中的Java对象转换为一系列位的一种方式,而反序列化实际上是将这些位作为对象带入内存的过程。所以我一直认为反序列化是带回来的将内存作为一系列位的对象。因此,将某些内容存储为反序列化数据的术语让我感到困惑。对我来说,存储(作为一系列位)是序列化,检索是反序列化。所以我真的无法想象将某些东西存储为反序列化数据意味着什么。正因为如此,我也无法理解为什么序列化表单在缓存中占用的空间更少。在我看来,反序列化不仅仅是倾倒对象并将它们取回,但我不知道是什么,并且非常想理解这一点。是不是因为序列化格式真的是某种压缩格式?和反序列化格式没有任何压缩?据我所知,在 Java 编程中,我从未遇到过将对象存储为反序列化格式的概念。

Dhi*_*raj 0

我自己找到了答案,所以考虑将其发布,因为它可能会帮助处于类似困惑的人。

“存储为反序列化对象”的整个混乱是由我所指的特定书中解释它的方式引起的。

Spark 要么将 RDD 作为 Java 对象缓存在内存中,因为 RDD 只是某个类(某个 RDD 类)的另一个对象,要么将其写入磁盘,当写入磁盘时,它会被序列化(在 Java/Scala 的情况下,使用默认的 Java 序列化,对于 Python,使用 python 的“pickle”模块来序列化它)。这就是全部内容。因此,每当我们谈论“反序列化”RDD 时,我们总是指内存中的 RDD。理想情况下,他们应该将其称为非序列化而不是反序列化,以避免混淆,但无论如何。序列化 RDD 始终指的是写入(缓存)到磁盘的内容。

  • 序列化并不意味着存储介质。即您可以在内存中序列化一个对象。另请参阅 Spark 文档:http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence (2认同)