什么是弹性分布式数据集 (RDD)?

作者

James Holdsworth

Content Writer

Matthew Kosinski

Enterprise Technology Writer

什么是弹性分布式数据集 (RDD)?

弹性分布式数据集 (RDD) 是不可篡改、可容错的元素集合,可以分布在多个集群节点上以并行处理。RDD 是开源数据处理引擎 Apache Spark 中的基本数据结构。

Spark 的开发是为了弥补 MapReduce 的缺点,MapReduce 是一种将大型数据处理任务“分块”,划分为多个较小的并行任务的编程模型。

MapReduce 可能很慢而且效率低下。它需要复制(在不同位置维护多个数据副本)、序列化(协调对多个程序使用的资源的访问)和密集的 I/O(磁盘存储空间的输入/输出)。

Spark 专用于减少不必要的处理。MapReduce 将中间数据写入磁盘,而 Spark 使用 RDD 在内存中缓存和计算数据。因此,Spark 的分析引擎处理数据的速度比 MapReduce 快 10-100 倍。1

RDD 和 Apache Spark

Apache Spark 是一种快速、开源、大规模的数据处理引擎,通常用于机器学习 (ML) 和人工智能 (AI) 应用程序。可将 Spark 视作 Hadoop 的改进版,更具体地说,是对 Hadoop 原生数据处理框架 MapReduce 的改进。

Spark 通过在大型计算机集群之间分配数据处理工作流程来实现扩展,并利用内置功能支持多个节点上的并行计算以及容错。

它包括许多应用程序编程接口 (API),适用于常见的数据科学和数据工程编程语言,包括 Java™、Python (PySpark)、Scala 和 R。

Spark 使用 RDD 来管理和处理数据。每个 RDD 被分成多个逻辑分区,这些分区可以同时在不同的集群节点上进行计算。用户可以执行两种类型的 RDD 操作:转换和行动。

转换是用于创建新 RDD 的操作。

操作指示 Spark 应用计算并将结果传回 Spark 驱动程序(管理 Spark 作业的进程)。

Spark 对内存中的 RDD 执行转换操作和行动操作,这是 Spark 速度更快的关键。Spark 还可以将数据存储在内存中或写入磁盘以增加持久性。

最新的 AI 新闻 + 洞察分析

在每周的 Think 时事通讯中,发现专家精选的有关 AI、云等的洞察分析和新闻。

立即订阅

RDD 的工作原理

弹性分布式数据集具有弹性且为分布式。那意味着:

有弹性

RDD 的名称中包含“弹性”,因为它们跟踪数据沿袭信息,以便在发生故障时可以重建丢失的数据,从而使 RDD 具有高度容错能力。

作为这种数据弹性的一个例子,假设在处理一个 RDD 分区期间一个执行器核心丢失。驱动程序将检测到该故障,并将该分区重新分配给其他执行器核心。

分布式

RDD 之所以称为“分布式”,是因为它们被拆分为较小的数据组,这些数据组可以分发到不同的计算节点并同时进行处理。

除了这两个核心特征外,RDD 还有其他一些特性,决定了其在 Spark 中的重要性和操作。

内存计算

许多数据处理框架(尤其是 MapReduce)必须对外部存储系统执行多次读取或写入操作,从而导致性能下降。RDD 可帮助 Apache Spark 解决此问题。RDD 使用内存中计算将迭代操作的中间结果存储在随机存取存储器 (RAM) 中,从而减少磁盘 I/O。使用内存中计算和存储可以支持更快的访问和近乎实时的处理。

RDD 还有助于缩短机器学习算法的训练时间,并加快大规模大数据分析的处理速度。使用内存计算可以减少访问数据存储所需的时间。

惰性求值

在 Spark 中,所有转换(用于创建新 RDD 的操作)都是“惰性的”,意味着数据不会立即被加载或计算。

相反,转换操作在有向无环图 (DAG) 中被跟踪,并且仅在驱动程序有特定的行动调用时才运行。

驱动程序指示 Spark 作业上的集群计算的主要功能和操作,例如聚合、收集、计数或将输出保存到文件系统。

数十种可能的行动操作和转换操作包括 aregateByKey、countByKey、flatMap、groupByKey、reduceByKey 和 sortbyKey。

惰性求值有助于消除不必要的处理和删减不必要的计算,从而优化数据处理流水线。

分区

Spark 在多个节点上自动对 RDD 进行分区,这样它就可以处理单一节点无法容纳的海量数据。为了避免损坏,每个单独的分区都存储在一个节点上,而不是分布在多个节点上。

使用 RDD,组织将能够定义计算分区的位置,以便任务可以在靠近所需数据的位置运行。这种位置分配方式有助于提高处理速度。

此外,还可以增加集群中的执行器(执行驱动程序分配的任务的计算机)的数量,以增强系统的并行处理能力。输出中的并行度取决于父 RDD 中的分区数量。

可以在集群的逻辑分区中创建 RDD,以便在多个节点上实现并行操作。可以从各种稳定的存储源创建 RDD,例如 Amazon Web Services (AWS) S3、Hadoop 分布式文件系统 (HDFS)、Apache HBase 和 Cassandra。也可以通过 Scala 和 Python 等编程语言来创建 RDD。

AI Academy

数据管理是生成式 AI 的秘诀吗?

深入了解为什么高质量数据对于成功使用生成式 AI 至关重要。

转到视频集

持久性

Spark RDD 可以跨操作将数据集缓存在内存中。每个节点都可以将其计算出的分区存储在内存中,并在对数据集或结果数据集执行后续操作时重新使用。这种持久性可以大幅加快处理速度。

Spark 还为用户提供了交互式存储选项,让他们能够控制数据的存储方式。数据可以存储在内存或磁盘中,或同时采用两者相结合的方式。

不可篡改性

RDD 是不可变的,这意味着它们在创建后无法修改。不变性有助于数据在多次操作中保持稳定。

这还能让多个进程共享数据变得更容易、更安全,并有助于防止不同线程同时更新而造成的数据损坏。

虽然 RDD 不可篡改,但用户可以通过对现有 RDD 执行转换操作来创建新的 RDD,这样,就可以在不更改原始数据的情况下更新数据集。

非结构化数据的容量

RDD 可以处理非结构化和结构化数据。 在处理非结构化数据时,可以从多种类型的数据库、媒体流或文本文件中提取信息,而无需固定架构或创建 DataFrame。

也就是说,用户可以在 Spark 中创建 DataFrame,这样就可以利用某些优化来提高性能。