关于Spark RDD需要了解的重要事项

387 阅读4分钟

什么是Spark中的RDD?

RDD 是"弹性分布式数据集 "的缩写。Apache Spark中的RDD是一种数据结构,也是在集群的不同节点上计算的一个不可变的对象集合。

  • 弹性即容错性,数据存在于多个可执行节点中,以便在任何节点发生故障时,可以从其他可执行节点获得备份。
  • 分布式 因为数据占据在多个节点上。
  • 数据集 代表数据的记录。用户可以从外部加载数据集,可以是JSON文件、CSV文件、文本文件或通过JDBC的数据库,没有特定的数据结构。

Apache Spark中对RDD的需求

  • Map Reduce技术不适合复杂机器学习算法中的分布式迭代计算。
  • 传统技术很耗费时间。
  • 他们通过数据复制和数据序列化产生了大量的数据冗余。

Spark RDD的特点

Apache Spark RDD的特点是:-

图:RDD的特点

1.在内存中计算:-

在这种类型的计算中,数据被保存在RAM中,而不是磁盘驱动器中,它也提高了系统的计算速度,同时也提供了对数据的便捷访问。内存计算也有利于实时处理和欺诈检测。

2.懒人评估:-

Spark将锁定所有我们应用在它身上的转换,并且在行动被激起之前不会提供任何显示的输出。

3.不可变性:-

Spark RDD是不可变的,因为RDD提供的访问是只读的,访问和修改RDD的唯一方法是应用一个转换。

4.容错性:-

RDD是容错的,因为RDD中任何丢失的分区都可以通过对线程中丢失的分区应用简单的转换来回滚。

5.持久性:-

用户可以说明他们将重复使用哪些RDDs,并为它们选择存储策略。

6.分区:-

Spark RDD可以使用分区实现并行化。Spark确定了数据被划分的部分数量,我们可以通过对现有分区进行一些转换来创建一个分区。

7.位置粘性:-

RDDs能够定义放置偏好来计算分区。放置偏好指的是关于RDD的位置信息。

8.粗粒度的操作:-

适用于RDD的每个操作都是粗粒度操作。

Spark RDD操作

在Apache Spark RDD中,有两种类型的操作:一是

  1. 转化
  2. 操作

变换

在Apache Spark中,转换是对RDD的懒惰操作,因为它创建了一个或多个新的RDD,当一个行动发生时,它就会执行。因此,转换从一个现有的数据集创建一个新的数据集。

示例:-

在这个例子中,我们创建了一个RDD seq,并对其进行了地图转换。

有两种转换方式:狭义转换和广义转换。

狭义转换:-

它是map、filter和这样的结果,数据只来自一个分区,即它是自给自足的,一个输出的RDD的分区的记录来自父RDD的一个分区。

广义转换:-

这是类似groupByKey()和reduceByKey()函数的结果,因为计算单个分区的记录所需的数据可能存在于父RDD的许多分区中。

行动:-

Spark中的 Action返回RDD计算的最终结果。它使用脉络图触发执行,将数据加载到原始的RDD中,进行所有的中间转换,并将最终结果返回给驱动程序或写入文件系统中。行进图是RDD的所有并行RDD的依赖图。

行动是产生非RDD值的RDD操作。它们在Spark程序中具体化一个值。行动是将结果从执行器发送到驱动器的方法之一。First(), take(), reduce(), collect(), the count() 是Spark中的一些Action。

使用转换,人们可以从现有的RDD中创建RDD。但当我们想处理实际的数据集时,我们就会使用Action。当Action发生时,它并不创建新的RDD,这与转换不同。因此,Action是RDD操作,不提供RDD值。Action将其值存储到驱动器或外部存储系统中。它将RDD的懒散性带入了运动中。

在这里,先前我们对seq RDD应用了map转换,以存储seq RDD中每个单词的第一个字母,为了显示应用转换的内容,我们必须使用collect()方法进行操作。

结论

综上所述,Spark RDD通过引入内存处理、不变性、持久性等功能,克服了Hadoop MapReduce的不足之处。但是,RDD也有一些局限性,例如,没有内置的优化,存储和性能限制等。
由于RDD的局限性,为了使Spark的功能更加全面,就出现了DataFrame和Dataset的概念。