App -> job -> stage -> task
app中的每一个action算子都会触发一个job,每个job根据宽依赖划分为若干stage,每个stage有若干窄依赖的tasks,tasks并行执行,task中后面的transformation的输入是前面的输出。每个job的结果都会汇总到driver中。
问题1:如何划分tasks?
一个stage中所有由黑线连接的pipeline都代表一个可以并行执行的task,task的数量由该stage最后一个RDD的partition的数量决定。其中,task分为两类,resulyTask和mapShuffledTask
//对于OneToOne的narrow dependency
//对于N:1的narrow denpendency,只不过一个task要读取多个partition中的数据。
问题2:什么是宽依赖 窄依赖?
官方解释是,窄依赖:子RDD的每个partition只依赖父RDD一个或一部分的partition。同时也说了,Operations which can cause a shuffle include repartition operations like repartition and coalesce, ‘ByKey operations (except for counting) like groupByKey and reduceByKey, and join operations like cogroup and join.