Applications
一个spark Application由一个或多个job组成。
Jobs
一个job是由一个或多个stage组成的。对RDD每次执行一个action操作,都会触发提交一个job。
Stages
一个stage由一个或多个task组成。RDD经过一系列的转换会生成一个DAG,spark会根据宽依赖(wide dependency)将DAG划分为不同的stage。
Tasks
一个task负责处理RDD一个partition的数据。一个stage内部会启动多个task。
样例分析
在spark上运行如下代码
object SimpleApp {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val rddA = sc.textFile("/tmp/xyx/textA")
val rddB = sc.textFile("/tmp/xyx/textB")
val rddAA = rddA.flatMap(line => line.split(",")).map(word => (word, 1))
val rddBB = rddB.flatMap(line => line.split(",")).map(word => (word, 1))
val rddAAA = rddAA.groupByKey(1)
val rddBBB = rddBB.groupByKey(1)
val rddC = rddAAA.join(rddBBB)
rddC.count
rddC.collect
sc.stop()
}
}
代码中运行了两个RDD的action(count
和collect
),所以这个spark的Application会启动2个job,如下图
可以看到每个job都是由3个stage组成的,只不过它们的前两个stage完全一样,所以Job 1的状态是skipped。
那么为什么是3个stage,是怎么划分的?
这就要看一下上面代码中RDD的转换有哪些是宽依赖,即
groupByKey
和join
。那么从rddA转换为rddAA是一个stage,rddB转换为rddBB是一个stage,最后上面两个stage的结果rddAAA和rddBBB到rddC为一个stage,一共3个stage。
进入到Job 0中,如下图,看一下具体的3个stage,每个stage里面启动了多个task。