如何理解Spark中的血统概念(RDD)
简述Spark的宽窄依赖
RDD 只支持粗粒度转换,即在大量记录上执行的单个操作。将创建 RDD 的一系列 Lineage
(血统)记录下来,以便恢复丢失的分区。RDD 的 Lineage 会记录 RDD 的元数据信息和转
换行为,当该 RDD 的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的
数据分区。
RDD在Lineage依赖方面分为两种Narrow Dependencies与Wide Dependencies用来解决数
据容错时的高效性以及划分任务时候起到重要作用。
窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用;
宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,
会引起 Shuffle。
Spark如何划分stage,每个stage又根据什么决定task个数?
一个spark应用程序包括job,stage,task
job是以action方法为界,遇到一个action方法则触发一个job;
stage是job的子集,以RDD宽依赖为界,遇到shuffle做一次划分
task是stage的子集,以并行度来衡量,分区数是多少,则有多少个task
Spark的任务调度是从DAG切割开始,主要是由DAGScheduler来完成.当遇到一个Aciton操作后就会触发一个Job的计算,SparkContext将Job交给DAGScheduler提交,它会根据RDD的血缘关系构成的DAG进行切分,将一个Job划分为若干个Stages,具体划分策略是,由最终的RDD不断通过依赖回溯判断父依赖是否是宽依赖,即以Shuffle为界,划分Stage,窄依赖的RDD之间被划分到同一个Stage中,可以进行pipeline式的计算.划分的Stages分两类,一类叫做ResultStage,为DAG最下游的Stage,由Action方法决定,另一类叫做ShuffleMapStage,为下游Stage准备数据.
Stage提交时会将Task信息序列化并被打包成TaskSet交给TaskScheduler,一个Partition对应一个Task.