1、RDD的背景
(1)MapReduce - 将中间结果写入到HDFS中
目前MapReduce框架都是把中间结果写入到HDFS中,带来了大量的数据复制、磁盘IO和序列化开销。
(2)RDD - 数据操作管道化
RDD将具体的应用逻辑表达为一系列转换处理,不同RDD之间的转换操作形成依赖关系,可以实现数据管道化,避免中间存储的结果,大大降低了数据复制、磁盘IO和序列化开销。
2、RDD概念
一个可并行操作的有容错机制的数据集合,本质上是一个只读的分区记录。
(1)每个RDD可以被分为多个分区;
(2)每个分区就是一个数据集片段;
(3)每个RDD的不同分区可以保存在不同节点上从而在集群的不同节点进行计算。
2.1、并行操作
并行集合被创建后,即可并行操作。
并行集合被切片后,spark会在集群上为每一个切片运行一个任务。
2.2、容错机制
数据只读,不可修改,若要修改,必须从父RDD转换到子RDD。
RDD是一种天生具有容错机制的特殊集合,不需要通过数据冗余的方式(比如检查点)实现容错,而只需通过RDD父子依赖血缘关系重新计算得到丢失的分区来实现容错,无需回滚整个系统,这样就避免了数据复制的高开销,而且重算过程可以在不同节点之间并行进行,实现了高效的容错。
血缘关系:即DAG拓扑排序结果
(1)采用了惰性调用*,通过血缘关系连接起来的一系列RDD操作实现管道化,不用担心有过多中间数据。
(2)一个操作得到的结果不需要保存为中间数据,直接管道化流入到下一个操作进行处理,保证了每个操作在处理逻辑的单一性。
2.3、中间结果持久化
数据在内存中的多个RDD操作之间进行传递,不需要“落地”到磁盘上,避免了不必要的读写磁盘开销。
3、RDD操作
3.1、转换操作(Transform)
(1)指定RDD之间的依赖关系。
(2)接受RDD并返回RDD。
3.2、行动操作(Action)
(1)执行计算并指定输出形式;
(2)接受RDD返回一个值或结果集。
4、RDD执行过程
(1)RDD读入外部数据源(或内存中的集合)进行创建;
(2)RDD经过一系列“转换”操作,每次都会产生不同的RDD,供给下一个“转换”使用;
转换操作:只是spark记录下基础数据集及RDD的生成轨迹,即互相之间的依赖关系。
构建起fileRDD和filterRDD之间的依赖关系,形成DAG图,
这时候并没有发生真正的计算,只是记录转换的轨迹;
(3)最后一个RDD经“行动”操作进行计算处理,并输出到外部数据源。
行动操作:真正计算行为。
触发真正的计算。
5、RDD的运行过程
创建RDD对象;
SparkContext:计算RDD之间的依赖关系,构建DAG;
DAGScheduler:DAG图分解成多个阶段,每个阶段中包含了多个任务,每个任务会被任务调度器分发给各个工作节点(Worker Node)上的Executor去执行。