菜单
本页目录

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
  1. DAG生成:在程序开始时,Spark不会立即执行,而是为flatMapfilter操作构建DAG,这些都是Transformation操作。
  2. 分区:文本文件被分割成多个分区,flatMapfilter操作将在每个分区上并行执行。
  3. Action触发Job:当调用count()时,Action触发了计算过程,Spark会调度DAG,执行所有必要的操作来计算结果。
  4. 分区处理:每个分区会独立统计以“A”开头的单词,结果会在最后合并。

通过这样的例子,可以看出DAG、分区以及Job与Action之间的联系:DAG定义了计算过程,分区决定了并行执行的粒度,而Job是由Action来触发实际执行的。