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

时间:2015-08-13 09:30:30

标签: apache-spark rdd

我读到当RDD在内存中持久存在某种序列化时(无论是默认的Java序列化还是类似Kryo序列化),它占用的内存空间更少。我对序列化的理解是它只是一种将内存中的Java对象转换为一系列位的方法,而反序列化实际上是将这些位作为对象存入内存的进程。因此,我总是将反序列化视为作为一系列位的对象重新存储到内存中。因此,将某些内容存储为反序列化数据的术语让我感到困惑。对于我来说,存储(作为一系列位)是序列化和检索是反序列化。因此,我无法想象通过将某些内容存储为反序列化数据意味着什么。因此,我也无法理解为什么序列化表单在缓存中占用的空间更少。在我看来,除了转储对象并让它们回来之外,还有更多的去/序列化,但我不知道是什么,并且完全想要了解它。是因为序列化格式真的是某种压缩格式吗?和反序列化的格式没有任何压缩?据我所知,在Java编程中,我从来没有遇到过将对象存储为反序列化格式的概念。当我们提到存储时,任何Java文章都会立即开始讨论序列化和反序列化,它只会在阅读的背景下进行讨论并将其作为对象重新开始。

1 个答案:

答案 0 :(得分:0)

我自己想出了答案,所以想发布它可能有助于那些陷入类似困惑的人。

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

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