Lineage
RDD之间存在依赖关系,称为Lineage。便于容错。
RDD依赖关系查看
- rdd.toDebugString 展示RDD的多级依赖关系,返回string。
(2) MapPartitionsRDD[7] at mapValues at CityADTOP3.scala:37 []
| ShuffledRDD[5] at groupByKey at CityADTOP3.scala:27 []
+-(2) MapPartitionsRDD[4] at map at CityADTOP3.scala:24 []
| ShuffledRDD[3] at reduceByKey at CityADTOP3.scala:22 []
+-(2) MapPartitionsRDD[2] at map at CityADTOP3.scala:16 []
| in/agent.log MapPartitionsRDD[1] at textFile at CityADTOP3.scala:14 []
| in/agent.log HadoopRDD[0] at textFile at CityADTOP3.scala:14 []
- rdd.dependences 返回一个Seq[Dependency[_]]。
窄依赖:
一对一 , 多对一
宽依赖:
一对多,一个分区的数据被打乱到多个分区中。
DAG
DAG 有向无环图,RDD通过一系列转换形成DAG,RDD之间根据不同的依赖关系将DAG划分为不同的Stage。窄依赖:RDD转换操作在一个stage中完成。宽依赖:由于有shuffle存在,只能等到父RDD的所有分区处理完成之后,才能开始后面依赖的计算,因此宽依赖是划分stage的依据,同时也是spark的瓶颈之一。 每个stage之间 需要等上一个stage计算完,才能进行下一个stage的运算,其实就是等shuffle完成。
任务划分:
RDD任务划分分为:Application->job->satge->task ,一对n ,即:一个Application可对应多个job,一个job可对应多个stage,一个satage可对应多个task。
- Application: 初始化一个sparkContext,即生成一个Application。(AM)
- job: 一个Action算子就会生成一个job。 rdd.foreach() 一个job; rdd.saveAsTextFile() 另一个job。take算子可以产生多个job,一个分区对应一个job。
- stage: 遇到一个宽依赖就会划分一个stage。
- task : stage是一个taskSet。将stage划分的结果发送到不同的executoe中执行即为一个task。 一个stage的task数,由最后一个RDD的分区数决定。最后一个RDD有多少个分区,就会产生多少个task数。
persist 不会重构血缘关系。
检查点:
行动算子触发checkpoint。重构血缘关系。persist 不会重构血缘关系。