我是 Spark 新手,我正在尝试直观地了解 RDD 在内存中的表示方式。
HDFS RDD 很简单,因为分区由文件系统本身处理。也就是说,HDFS 本身将大文件分成块以确保容错,因此其上的 RDD 是微不足道的。
但是如果 RDD 不指向 HDFS 上的数据呢?,也许是指向 RDBMS 或 MongoDB 的东西。
立即想到的几个问题:
总之,我无法理解Spark如何使RDD成为各种数据源的通用抽象。
在 Apache Spark 中,当处理未存储在 Hadoop 分布式文件系统 (HDFS) 中的弹性分布式数据集 (RDD) 时,内存布局取决于为 RDD 选择的存储级别。 Spark 允许多种存储级别,例如 MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER 和 MEMORY_AND_DISK_SER。
以下是每项的简要概述:
MEMORY_ONLY:RDD 分区作为反序列化的 Java 对象存储在 Spark 工作节点的 JVM 堆内存中。此存储级别提供对数据的快速访问,但会消耗更多内存。
MEMORY_AND_DISK:RDD分区存储在内存中,但如果内存不足,部分分区存储在磁盘上。此存储级别在内存使用和潜在磁盘 I/O 之间进行权衡。
MEMORY_ONLY_SER:RDD分区以序列化格式存储在JVM堆内存中。与 MEMORY_ONLY 相比,这减少了内存使用量,因为对象以更紧凑的形式存储,但在处理之前需要反序列化。
MEMORY_AND_DISK_SER:与MEMORY_AND_DISK类似,但RDD分区以序列化格式存储。这会减少内存使用量,如果内存不足,可能会溢出到磁盘,但同样,它需要在处理之前进行反序列化。
在所有情况下,Spark 使用分布式内存模型,其中数据跨集群中的多个节点进行分区。每个节点内存中的确切内存布局取决于分区方案、序列化方法和所选存储级别等因素。 Spark 对用户透明地管理此布局,确保容错和高效的数据处理。