非HDFS RDD的内存布局是怎样的?

问题描述 投票:0回答:1

我是 Spark 新手,我正在尝试直观地了解 RDD 在内存中的表示方式。

HDFS RDD 很简单,因为分区由文件系统本身处理。也就是说,HDFS 本身将大文件分成块以确保容错,因此其上的 RDD 是微不足道的。

但是如果 RDD 不指向 HDFS 上的数据呢?,也许是指向 RDBMS 或 MongoDB 的东西。

立即想到的几个问题:

  1. 如何处理非本机分区的分区?
    • Spark 自己处理分区吗?或者它是否依赖 RDD 实现来做到这一点?
  2. 执行如何进行?
    • 以一个指向RDBMS的RDD为例,Spark是否会将其所有数据加载到每个执行器进程的内存中,然后运行所有转换?
    • 或者是否了解 RDBMS 的表结构并在进行转换时进行某种分区?

总之,我无法理解Spark如何使RDD成为各种数据源的通用抽象。

apache-spark rdd memory-layout
1个回答
0
投票

在 Apache Spark 中,当处理未存储在 Hadoop 分布式文件系统 (HDFS) 中的弹性分布式数据集 (RDD) 时,内存布局取决于为 RDD 选择的存储级别。 Spark 允许多种存储级别,例如 MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER 和 MEMORY_AND_DISK_SER。

以下是每项的简要概述:

  1. MEMORY_ONLY:RDD 分区作为反序列化的 Java 对象存储在 Spark 工作节点的 JVM 堆内存中。此存储级别提供对数据的快速访问,但会消耗更多内存。

  2. MEMORY_AND_DISK:RDD分区存储在内存中,但如果内存不足,部分分区存储在磁盘上。此存储级别在内存使用和潜在磁盘 I/O 之间进行权衡。

  3. MEMORY_ONLY_SER:RDD分区以序列化格式存储在JVM堆内存中。与 MEMORY_ONLY 相比,这减少了内存使用量,因为对象以更紧凑的形式存储,但在处理之前需要反序列化。

  4. MEMORY_AND_DISK_SER:与MEMORY_AND_DISK类似,但RDD分区以序列化格式存储。这会减少内存使用量,如果内存不足,可能会溢出到磁盘,但同样,它需要在处理之前进行反序列化。

在所有情况下,Spark 使用分布式内存模型,其中数据跨集群中的多个节点进行分区。每个节点内存中的确切内存布局取决于分区方案、序列化方法和所选存储级别等因素。 Spark 对用户透明地管理此布局,确保容错和高效的数据处理。

© www.soinside.com 2019 - 2024. All rights reserved.