1. 什么是血缘关系
就是在大量记录上执行的单个文件操作,将创建的RDD的一系列的血缘记录下来,以便恢复丢失的数据
A的操作行为依赖于B,B的操作行为依赖于C,然而A的操作行为间接依赖于C,推导于:
相邻的两个RDD的关系称之为依赖关系,新的RDD依赖于旧的RDD,多个连续的RDD的依赖关系,称之为血缘关系
每个RDD会保存血缘关系,但每个RDD不会保存数据,如果在reduceByKey过程中出现错误时,由于RDD2不会保存数据,但可以根据血缘关系将数据源重新读取进行计算
黄色区域就是每个RDD保存的血缘关系,reducrByKey出现错误后,会根据RDD2存储的血缘关系重新计算。
2. RDD宽窄依赖
- OneToOne
新的RDD的一个分区的数据依赖于旧的RDD一个分区的数据。旧的RDD里有两个分区,每个分区里的数据分别是1,2和3,4。在新的RDD分区里也有两个分区,且每个分区的数据还相同,则就是窄依赖。
通俗理解:
假设有两个班级出去春游,一班和二班分别有各自班主任带领游玩,窄依赖的理解就是班级看做成一个分区,班主任看作为此分区内的task任务,由于两个班各自的学生相同,也就是各个分区内的数据相同,所以这就是窄依赖。
- Shuffle
新的RDD的一个分区的数据依赖于旧的RDD多个分区的数据。旧的RDD里有两个分区,每个分区里的数据分别是1,2和3,4。在新的RDD分区里也有两个分区,但每个分区的数据已经发生改变,
通俗理解:
假设有两个班级出去春游,一班和二班分别有各自班主任带领游玩,宽依赖的理解就是班级看做成一个分区,班主任看作为此分区内的task任务,在阶段一里班主任带领各个班级游玩,但是在第二阶段里会出现两个景点,一班和二班里的同学想去的景点各不相同,于是就班级层次拆开,重新组合为两批不同景点的小分队,但在组合的过程中,我们必须要等待两个班级都完成自己的景点游玩,人到齐后,才可以开始第二阶段任务,由于分区相同,但每个分区内的人员情况发生变化,所以在第二阶段变成了景点导游带领同学们开始游玩,两个导游就变成了task任务,所以整个宽依赖过程中,task任务增多了, 所以这就是宽依赖。
3. 阶段任务
RDD 任务切分中间分为:Application、Job、Stage 和 Task
- Application:初始化一个 SparkContext 即生成一个 Application;
- Job:一个 Action 算子就会生成一个 Job;
- Stage:Stage 等于宽依赖(ShuffleDependency)的个数加 1;
- Task:一个 Stage 阶段中,最后一个 RDD 的分区个数就是 Task 的个数。
注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系。