【问题标题】:why serialized persisted RDD is occupies less memory than deserialized persisted RDD为什么序列化的持久化 RDD 比反序列化的持久化 RDD 占用更少的内存
【发布时间】:2015-08-13 09:30:29
【问题描述】:

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

【问题讨论】:

  • 好问题,但我没有看到关于为什么序列化 RDD 占用更少内存的答案?

标签: apache-spark rdd


【解决方案1】:

我自己想出了答案,所以想发布它,因为它可能会帮助有类似困惑的人。

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

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

【讨论】:

  • 序列化并不意味着存储介质。即您可以序列化内存中的对象。另请参阅 Spark 文档:spark.apache.org/docs/latest/…
  • 序列化RDD如何占用内存更少?
  • 看看堆外存储,它是RAM中的序列化存储
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2014-08-25
  • 1970-01-01
  • 2016-01-16
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多