Lineage (血统容错机制)
Spark 会将创建RDD
的一系列Lineage(血统)记录
下来,以便恢复丢失的分区
。RDD的Lineage会记录RDD的元数据信息和转换行为
,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
查看 RDD 的 Lineage
toDebugString
每一步 RDD 都会记录着前面产生 RDD 的所有操作,以便产生错误的时候追溯回去重新计算。
val conf = new SparkConf().setMaster("local[*]").setAppName("a") val sc = new SparkContext(conf) val intRDD = sc.makeRDD(List(1, 2, 3, 4)) val mapRDD = intRDD.map(_ + 2) val kvRDD = mapRDD.map(("a", _)) val reRDD = kvRDD.reduceByKey(_ + _) println(reRDD.toDebugString) ------------------- (16) ShuffledRDD[3] at reduceByKey at 算子.scala:123 [] +-(16) MapPartitionsRDD[2] at map at 算子.scala:122 [] | MapPartitionsRDD[1] at map at 算子.scala:121 [] | ParallelCollectionRDD[0] at makeRDD at 算子.scala:120 []
查看依赖类型
dependencies
val intRDD = sc.makeRDD(List(1, 2, 3, 4)) val mapRDD = intRDD.map(_ + 2) val kvRDD = mapRDD.map(("a", _)) val reRDD = kvRDD.reduceByKey(_ + _) println(reRDD.dependencies) --------------------------- List(org.apache.spark.ShuffleDependency@7923f5b3)
依赖机制
依赖值得是 子RDD 和 父RDD 之间的关系
RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。
窄依赖
窄依赖 指的是每一个父RDD
的Partition最多
被子RDD
的一个
Partition使用,窄依赖我们形象的比喻为
独生子女`
宽依赖
宽依赖 指的是多个子RDD
的Partition会依赖同一个父RDD
的Partition,会引起shuffle
,总结:宽依赖我们形象的比喻为超生
阶段划分
阶段划分指Job在执行过程中,是否需要等待某一操作执行完成才能进行下一步(比如 Shuffle ),
所以有
宽依赖
就需要划分一个阶段
任务划分
RDD任务切分中间分为:Application、Job、Stage和Task
- Application:初始化一个
SparkContext
即生成一个Application - Job:一个
Action算子
就会生成一个Job - Stage(阶段):根据RDD之间的
依赖关系
的不同将Job划分成不同的Stage,遇到一个宽依赖
则划分一个Stage
。 - Task(任务):Stage是一个TaskSet,将Stage划分的结果发送到
不同的Executor
执行即为一个Task
。
注意:Application->Job->Stage-> Task每一层都是1对n的关系。
版权声明:《 Spark RDD 血缘机制 》为明妃原创文章,转载请注明出处!
最后编辑:2020-2-18 14:02:15