什么是Spark RDD以及我们为什么需要它?

随着时间的推移,大数据分析已达到一个新的程度,反过来又改变了其运作模式和期望。今天的大数据分析不仅处理大量数据,而且还具有快速周转时间的既定目标。虽然Hadoop是大数据分析背后无与伦比的技术,但它在快速处理方面存在一些不足。但是,随着Spark的出现,数据处理速度便有了更大的期望。

 

当我们谈到Spark时,我们想到的第一个术语是弹性分布式数据集(RDD)或Spark RDD,它使数据处理更快。此外,这也是Spark的关键特性,它支持在计算期间对数据集进行逻辑分区。

 

在此文中,我们将讨论Spark RDD的技术方面,进一步了解Spark RDD的底层技术细节。除此之外,还将概述RDD在Spark中的使用。

 

 

Spark RDD及其特性

RDD定义为Resilient Distributed Dataset(弹性分布式数据集),其中每个术语都表示其特性。

  • Resilient: 通过使用RDD谱系图(DAG)实现容错。因此,当节点发生故障时,可以进行重新计算。
  • Distributed:  Spark RDD的数据集驻留在多个节点中。
  • Dataset: 您将使用的数据记录。

在Hadoop设计中,RDD是一个挑战。然而,使用Spark RDD解决方案似乎非常高效,这取决于它的惰性计算。Spark中的RDDs按需工作。因此,它节省了大量的数据处理时间和整个过程的效率。

Hadoop Map-reduce通过其特性克服了Spark RDD的许多缺点,这是Spark RDD流行的主要原因。

 

 

Spark RDD的核心特性

  • 内存计算
  • 惰性计算
  • 容错
  • 不可变性
  • 分区
  • 持久性
  • 粗粒度操作
  • 位置粘性

我们将在下一节中逐步讨论这些问题。

 

Spark RDD是一种表示分布在多个节点上的数据集的技术,可以并行操作。换句话说,Spark RDD是Apache Spark的主要容错抽象,也是Apache Spark的基本数据结构。

Spark中的RDD是一个不可变的分布式对象集合,它支持以下两种方法

  • cache()
  • persist()

 

Spark RDD的内存缓存技术对Spark RDD中的数据集进行逻辑分区。内存缓存的好处在于,如果数据不合适,它会将多余的数据发送到磁盘进行重新计算。这就是为什么它被称为弹性。因此,您可以在需要时在Spark中提取RDD。因此,它使整个数据处理更快。

Spark在数据处理方面比Hadoop快100倍。下面是使Apache Spark更快的因素!

 

 

Spark RDD支持的操作

Spark中的RDD支持两种类型的操作:

  1. Transformations
  2. Actions

 

Transformation

transformation的情况下,Spark RDD从现有数据集创建一个新的数据集。要引用一个Spark RDD转换示例,我们可以说map是一个转换,它通过一个函数传递每个dataset元素。作为返回值,它发送表示结果的新RDD。

Scala:

val l = sc.textFile(“example.txt”)

val lLengths = l.map(s => s.length)

val totalLength = lLengths.reduce((a, b) => a + b)

如果以后想使用llength,可以使用persist()函数,如下所示:

lLengths. persist()

您可以从https://spark.apache.org/参考API文档以获得Spark RDD支持的转换的详细列表。

 

Spark RDD支持两种类型的转换:

  1. Narrow transformation
  2. Wide transformation

Narrow transformation的情况下,输出RDD的父RDD与一个数据分区相关联。而在广泛的转换中,输出RDD是许多父RDD分区的结果。换句话说,这就是所谓的shuffle transformation。

 

所有Spark RDD转换都是惰性的,因为它们不会立即计算结果。相反,它们记住对一些基本数据集应用的转换,这些数据集引用了一些文件,如示例所示。当任何操作需要一个结果时,只有转换在Spark RDD中计算。这进而导致更快和更有效的数据处理。

 

每次对每个转换后的RDD运行操作时,都会在Spark RDD中进行重新计算。但是,使用persist方法Spark可以将元素保存在集群中,以便下次查询时更快地访问它。还支持在磁盘上持久存储Spark RDDs或跨多个节点进行复制。

 

 

Actions

在操作期间,RDD在对数据集执行计算之后,将一个值返回给驱动程序。例如,reduce是一个使用某个函数聚合所有RDD元素并将最终结果返回给主程序的操作

创建Spark RDD有以下三个过程。

  1. 使用并行集合
  2. 从外部数据集(即。其他外部存储系统,如共享文件系统、HBase或HDFS)
  3. 来自现有Apache Spark RDDs

接下来,我们将讨论这些方法中的每一种,以了解如何使用它们来创建Spark RDDs。

 

弹性分布式数据集(RDD)是Apache Spark的重要特性,这使得它非常重要。让我们了解Apache Spark在大数据行业中的重要性。

 

并行集合

您可以通过在Java、Scala或Python中现有的驱动程序集合上调用SparkContext接口的parallelize方法来创建并行集合。在本例中,复制的集合元素构成一个分布式数据集,可以并行操作。

 

Scala中并行化集合的Spark RDD例子:

将数字2到6保存为并行集合:

val collection = Array(2, 3, 4, 5,6)

val prData = spark.sparkContext.parallelize(collection)

 

在这里,创建的分布式数据集prData能够并行操作。因此,您可以调用prData。reduce()将数组中的元素相加。

 

并行化集合的一个关键参数是决定要将数据集分割成哪些分区号。在本例中,Spark为集群的各个分区运行单个任务。通常,对于集群中的单个CPU, 2-4个分区是理想的。不过Spark会根据集群自动设置分区的数量。但是,用户也可以通过将其作为并行化的第二个参数传递来手动设置它。

 

外部数据库

Apache Spark可以从任何Hadoop支持的文件存储创建分布式数据集,其中可能包括:

  • Local file system
  • HDFS
  • Cassandra
  • HBase
  • Amazon S3

Spark支持类似的文件格式:

  • Text files
  • Sequence Files
  • CSV
  • JSON
  • Any Hadoop Input Format

例如,可以使用SparkContext接口的textFile方法创建文本文件Spark RDDs。这个方法接受文件的URL,不管它是系统上的本地路径,还是hdfs://,等等)。最后,它将文件作为行集合读取。

 

这里的重要因素是,如果使用本地文件系统上的路径,则必须在从节点上的相同路径上访问该文件。因此,要么必须将数据文件复制到所有从节点,要么需要使用网络挂载的共享文件系统。

 

您可以使用数据帧读取器接口来加载外部数据集,然后使用. RDD方法将数据集<Row>转换为RDD <Row>。

 

下面的文本文件转换示例稍后将返回字符串数据集。

val exDataRDD = spark.read.textFile(“path/of/text/file”).rdd

 

 

来自现有RDDS

RDDS是不变的;因此你可以改变它。但是,使用transformation,您可以从现有的RDD创建一个新的RDD。由于没有因为突变而发生变化,所以它在集群中保持一致性。为此目的使用的操作很少是

  • map
  • filter
  • count
  • distinct
  • flatmap

例如:

val seasons =spark.sparkContext.parallelize(Seq(“summer”, “monsoon”, “spring”, “winter”))

val seasons1= seasons.map(s => (s.charAt(0), s))

 

posted @ 2019-03-26 23:35  twoseee  阅读(980)  评论(2编辑  收藏  举报