目录
一、RDD概念
RDD(
Resilient Distributed Dataset
)叫做弹性分布式数据集,是
Spark
中最基本的数据抽象,它代表⼀个
不可变、可分区、⾥⾯的元素可
并⾏计算
的集合。
RDD
具有数据流模型的特点:⾃动容错、位置感知性调度和可伸缩 性。RDD
允许⽤户在执⾏多个查询时显式地将⼯作集缓存在内存中,后续的查询能够重⽤⼯作集,这极⼤地提升了查询速度。
RDD 是 Spark 提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。
通俗点来讲,可以将 RDD 理解为一个分布式对象集合,本质上是一个只读的分区记录集合。每个 RDD 可以分成多个分区,每个分区就是一个数据集片段。一个 RDD 的不同分区可以保存到集群中的不同结点上,从而可以在集群中的不同结点上进行并行计算。
RDD 的分区及分区与工作结点(Worker Node)的分布关系
RDD 具有容错机制,并且只读不能修改,可以执行确定的转换操作创建新的 RDD。具体来讲,RDD 具有以下几个属性。
- 只读:不能修改,只能通过转换操作生成新的 RDD。
- 分布式:可以分布在多台机器上进行并行处理。
- 弹性:计算过程中内存不够时它会和磁盘进行数据交换。
- 基于内存:可以全部或部分缓存在内存中,在多次计算间重用。
总结:
在 Spark
中,对数据的所有操作不外乎创建
RDD
、转化已有
RDD
以及调⽤
RDD
操作进⾏求值。每个
RDD
都被分为多个分区,这些分区运⾏在集群中的不同节点上。RDD
可以包含
Python
、
Java
、
Scala
中任意类型的对象, 甚⾄可以包含⽤户⾃定义的对象。RDD
具有数据流模型的特点:⾃动容错、位置感知性调度和可伸缩性。
RDD
允许⽤户在执⾏多个查询时显式地将⼯作集缓存在内存中,后续的查询能够重⽤⼯作集,这极⼤地提升了查询速度。
二、RDD做了什么
启动
SparkShell
,执⾏如下命令:
sc.textFile(“xx").flatMap(_.split("")).map((_,1)).reduceByKey(_+_).saveAsTextFile(“xx")
总结:
RDD
的创建
->RDD
的转换
(
转换过程中为了减少数据计算有添加缓存
)->RDD
的⾏动
(
输出数据
)
三、RDD
RDD 实质上是一种更为通用的迭代并行计算框架,用户可以显示控制计算的中间结果,然后将其自由运用于之后的计算。
在大数据实际应用开发中存在许多迭代算法,如机器学习、图算法等,和交互式数据挖掘工具。这些应用场景的共同之处是在不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。
RDD 正是为了满足这种需求而设计的。虽然 MapReduce 具有自动容错、负载平衡和可拓展性的优点,但是其最大的缺点是采用非循环式的数据流模型,使得在迭代计算时要进行大量的磁盘 I/O 操作。
通过使用 RDD,用户不必担心底层数据的分布式特性,只需要将具体的应用逻辑表达为一系列转换处理,就可以实现管道化,从而避免了中间结果的存储,大大降低了数据复制、磁盘 I/O 和数据序列化的开销。