1.分区及分区与工作结点(Worker Node)的分布关系
• 通俗点来讲,可以将 RDD 理解为一个分布式对象集合,本质上是一个只读的分区记录集合。每个 RDD可以分成多个分区,每个分区就是一个数据集片段。
一个 RDD 的不同分区可以保存到集群中的不同结点上,从而可以在集群中的不同结点上进行并行计
2.RDD 执行过程:
RDD 的典型的执行过程如下:
读入外部的数据源(或者内存中的集合)进行 RDD 创建;RDD 经过一系列的 “转换” 操作,每一次都会产生不同的 RDD,供给下一个转换使用;最后一个 RDD 经过 “行动” 操作进行处理,并输出指定的数据类型和值。RDD 采用了惰性调用,即在 RDD 的执行过程中,所有的转换操作都不会执行真正的操作,只会记录依赖关系,而只有遇到了行动操作,才会触发真正的计算,并根据之前的依赖关系得到最终的结果。
下面以一个实例来描述 RDD 的实际执行过程,如下图所示,开始从输入中创建了两个 RDD,分别是 A 和 C,然后经过一系列的转换操作,最终生成了一个 F,这也是一个 RDD。注意,这些转换操作的执行过程中并没有执行真正的计算,基于创建的过程也没有执行真正的计算,而只是记录的数据流向轨迹。当 F 执行了行为操作并生成输出数据时,Spark 才会根据 RDD 的依赖关系生成有向无环图(DAG),并从起点开始执行真正的计算。正是 RDD 的这种惰性调用机制,使得转换操作得到的中间结果不需要保存,而是直接管道式的流入到下一个操作进行处理。
1.5. RDD 运行过程
通过上述对 RDD 概念、依赖关系和阶段划分的介绍,结合之前介绍的 Spark 运行基本流程,这里再总结一下 RDD 在 Spark 架构中的运行过程(如下图所示):
创建 RDD 对象;SparkContext 负责计算 RDD 之间的依赖关系,构建 DAG;DAGSchedule 负责把 DAG 图反向解析成多个阶段,每个阶段中包含多个任务,每个任务会被任务调度器分发给工作节点上的 Executor 上执行。