1. 应用程序: 一个spark提交。
2. 作业: 一旦进行了惰性评估,就会生成一个作业。
3. 阶段: 与shuffle和转换类型有关。我很难理解阶段的边界。
4. 任务: 它是单元操作。每个任务一个转换。每个转换一个任务。
需要帮助来改善这种理解。
主要功能是应用程序。
当您在RDD上调用动作时,将创建一个"job"。 Job是提交给Spark的工作。
基于洗牌边界,将作业分成"阶段"。这里可以帮助您理解。
每个阶段根据RDD中分区的数量进一步划分为任务。 因此,任务是Spark的最小工作单元。
应用程序 - 一个使用Spark API构建的用户程序。它由驱动程序和集群中的执行器组成。
作业 - 由多个任务组成的并行计算,响应于Spark操作(例如:save(),collect())而启动。 在与Spark shell的交互会话期间,驱动程序将您的Spark应用程序转换为一个或多个Spark作业。然后将每个作业转换为DAG。这实际上就是Spark的执行计划,其中DAG中的每个节点可以是单个或多个Spark阶段。
阶段 - 每个作业都被划分为较小的任务集合,称为阶段,并相互依赖。 作为DAG节点的一部分,阶段根据可以串行或并行执行的操作创建。并不是所有的Spark操作都能在单个阶段中进行,因此它们可能会被划分为多个阶段。通常,阶段是在操作的计算边界上确定的,在那里它们指示Spark执行器之间的数据传输。
任务 - 将发送到Spark执行程序的单个工作或执行单元。 每个阶段由Spark任务(一个执行单元)组成,然后在每个Spark执行器上分散; 每个任务映射到一个核心,并处理单个数据分区。因此,具有16个核心的执行器可以具有16个或更多任务并行工作于16个或更多分区上,使Spark任务的执行极其并行化!
声明:内容摘自:学习Spark
来自《一个开发者学习Apache Spark的7个步骤》
一个Spark应用程序的结构通常包含Spark操作,这些操作可以使用Spark的RDD、DataFrames或Datasets API在数据集上执行转换或动作。例如,在您的Spark应用程序中,如果您调用DataFrame或Dataset上的collect()或take()等操作,则该操作将创建一个作业。然后,作业将分解为单个或多个阶段;阶段进一步分为单个任务;而任务是Spark驱动程序调度器向Spark工作节点上的Spark Executors发送以在集群中执行的执行单元。通常,多个任务将在同一个执行者上并行运行,每个任务在其内存中处理其分区数据集单位。
我在Cloudera documentation中找到了一个非常好的定义。以下是要点。
在MapReduce中,计算的最高级别单元是作业。一个作业加载数据,应用map函数,进行洗牌操作,应用reduce函数,并将数据写回持久性存储。 但在Spark中,计算的最高级别单元是应用程序。Spark应用程序可以用于单个批处理作业、带有多个作业的交互式会话或长期运行的服务器,不断满足请求。Spark作业可能不仅包括单个map和reduce。