Job 与 Action
在Spark中,作业(Job)是由动作(Action)触发的计算流程。每次调用一个Action,Spark会根据前面的转换(Transformation)构建出一个DAG,然后根据DAG的结构执行相应的计算操作。
Transformation(转换)
- 这是对RDD的延迟操作,只有在Action操作被调用时才会被实际执行。
- 常见的Transformation有:
map()
、filter()
、flatMap()
等。 - 这些操作不会立即触发计算,它们只是记录在DAG中。
Action(动作)
- Action是实际触发计算的操作,如
count()
、collect()
、saveAsTextFile()
。 - 每次调用Action,Spark会启动一个Job,进行DAG的调度与执行。
- Action执行时,Spark会从源头读取数据,经过各个Transformation节点的处理,最终输出结果。
Job与Action的关系:
- 每个Action都会触发一个Job。
- Spark将所有的Transformation链条组成一个DAG,直到遇到Action时,DAG的调度和执行才会开始。
- 一次Spark程序中可以包含多个Action,也会触发多个Job。
举例讲解
假设我们有一组文本文件,想要统计文件中以字母“A”开头的单词数量:
val rdd = sc.textFile("hdfs://path/to/file")
val wordsRDD = rdd.flatMap(_.split(" ")) // Transformation
val filteredRDD = wordsRDD.filter(_.startsWith("A")) // Transformation
val count = filteredRDD.count() // Action
- DAG生成:在程序开始时,Spark不会立即执行,而是为
flatMap
和filter
操作构建DAG,这些都是Transformation操作。 - 分区:文本文件被分割成多个分区,
flatMap
和filter
操作将在每个分区上并行执行。 - Action触发Job:当调用
count()
时,Action触发了计算过程,Spark会调度DAG,执行所有必要的操作来计算结果。 - 分区处理:每个分区会独立统计以“A”开头的单词,结果会在最后合并。
通过这样的例子,可以看出DAG、分区以及Job与Action之间的联系:DAG定义了计算过程,分区决定了并行执行的粒度,而Job是由Action来触发实际执行的。