#|Spark-RDD的依赖关系

RDD和它依赖的父RDD的关系有两种不同的类型,即窄依赖和宽依赖。
窄依赖 子rdd对应一个或有限个父rdd
宽依赖 子rdd对应所有父rdd
宽依赖就会发生shuffle过程
Lineage(血统)

将创建RDD的一系列Lineage(即血统)
记录下来,以便恢复丢失的分区。RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部
分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
#|Spark-RDD的依赖关系
文章图片

DAG有向无环图 【#|Spark-RDD的依赖关系】#|Spark-RDD的依赖关系
文章图片

RDD任务的切分 #|Spark-RDD的依赖关系
文章图片

并行度:程序同一时间执行作业的线程个数。
原始的RDD通过一系列的转换就就形成了DAG,根据RDD之间的依赖关系的不同将DAG划分成不同的
Stage
#|Spark-RDD的依赖关系
文章图片

webUI中查看Stage和Task 因为在计算的时候textFile默认是2个partition,整个计算流程是3个stage,实际得到的task应该会是6个,实际的个数是4个
#|Spark-RDD的依赖关系
文章图片

要是出现skipped那么就会减少对应的task,但是这是没有问题的并且是对的.
任务出现skipped是正常的,之所以出现skipped是因为要计算的数据已经缓存到了内存,没有必要再重复计算。出现skipped对结果没有影响,并且也是一种计算优化.
在发生shuffle的过程中,会发生shuffle write和shuffle read。
shuffle write:发生在shuffle之前,把要shuffle的数据写到磁盘.
为什么:为了保证数据的安全性、避免占用大量的内存.
shuffle read:发生在shuffle之后,下游RDD读取上游RDD的数据的过程.
任务生成和提交的四个阶段 #|Spark-RDD的依赖关系
文章图片

四个步骤:
1,构建DAG
用户提交的job将首先被转换成一系列RDD并通过RDD之间的依赖关系构建DAG,然后将DAG提交到调
度系统;
DAG描述多个RDD的转换过程,任务执行时,可以按照DAG的描述,执行真正的计算;
DAG是有边界的:开始(通过sparkcontext创建的RDD),结束(触发action,调用runjob就是一个
完整的DAG形成了,一旦触发action,就形成了一个完整的DAG);
一个RDD描述了数据计算过程中的一个环节,而一个DAG包含多个RDD,描述了数据计算过程中的所
有环节;
一个spark application可以包含多个DAG,取决于具体有多少个action。
2,DAGScheduler将DAG切分stage(切分依据是shuffle),将stage中生成的task以taskset的形式发送
给TaskScheduler
为什么要切分stage?
一个复杂是业务逻辑(将多台机器上具有相同属性的数据聚合到一台机器上:shuffle)
如果有shuffle,那么就意味着前面阶段产生结果后,才能执行下一个阶段,下一个阶段的计算依赖上
一个阶段的数据
在同一个stage中,会有多个算子,可以合并到一起,我们很难称其为pipeline(流水线,严格按照流
程、顺序执行)
3,TaskScheduler 调度task(根据资源情况将task调度到Executors)
4,Executors接收task,然后将task交给线程池执行。

    推荐阅读