Spark RDD 血缘机制

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使用,窄依赖我们形象的比喻为独生子女`

mark

宽依赖

宽依赖 指的是多个子RDD的Partition会依赖同一个父RDD的Partition,会引起shuffle,总结:宽依赖我们形象的比喻为超生

mark

阶段划分

阶段划分指Job在执行过程中,是否需要等待某一操作执行完成才能进行下一步(比如 Shuffle ),

所以有宽依赖就需要划分一个阶段

任务划分

RDD任务切分中间分为:Application、Job、Stage和Task

  1. Application:初始化一个SparkContext即生成一个Application
  2. Job:一个Action算子就会生成一个Job
  3. Stage(阶段):根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖划分一个Stage
  4. Task(任务):Stage是一个TaskSet,将Stage划分的结果发送到不同的Executor执行即为一个Task

注意:Application->Job->Stage-> Task每一层都是1对n的关系。

mark

发表评论 / Comment

用心评论~