Spark中的应用程序、作业、阶段和任务概念是什么?

85
我的理解正确吗?
1. 应用程序: 一个spark提交。
2. 作业: 一旦进行了惰性评估,就会生成一个作业。
3. 阶段: 与shuffle和转换类型有关。我很难理解阶段的边界。
4. 任务: 它是单元操作。每个任务一个转换。每个转换一个任务。
需要帮助来改善这种理解。
5个回答

80

主要功能是应用程序。

当您在RDD上调用动作时,将创建一个"job"。 Job是提交给Spark的工作。

基于洗牌边界,将作业分成"阶段"。这里可以帮助您理解。

每个阶段根据RDD中分区的数量进一步划分为任务。 因此,任务是Spark的最小工作单元。


12
分享的链接是一个受保护的博客。它说:“此网站由其所有者标记为私人”。 - yardstick17
8
@AmitKushwaha: archive.org 很有帮助 ;-) - holzkohlengrill
2
你可以在他的新博客上找到它,链接为https://trongkhoanguyen.com/spark/understand-rdd-operations-transformations-and-actions/。 - Morgan Kobeissi
11
@MorganKobeissi现在那个链接也失效了。 - RyanQuey

53

应用程序 - 一个使用Spark API构建的用户程序。它由驱动程序和集群中的执行器组成。

作业 - 由多个任务组成的并行计算,响应于Spark操作(例如:save(),collect())而启动。 在与Spark shell的交互会话期间,驱动程序将您的Spark应用程序转换为一个或多个Spark作业。然后将每个作业转换为DAG。这实际上就是Spark的执行计划,其中DAG中的每个节点可以是单个或多个Spark阶段。

阶段 - 每个作业都被划分为较小的任务集合,称为阶段,并相互依赖。 作为DAG节点的一部分,阶段根据可以串行或并行执行的操作创建。并不是所有的Spark操作都能在单个阶段中进行,因此它们可能会被划分为多个阶段。通常,阶段是在操作的计算边界上确定的,在那里它们指示Spark执行器之间的数据传输。

任务 - 将发送到Spark执行程序的单个工作或执行单元。 每个阶段由Spark任务(一个执行单元)组成,然后在每个Spark执行器上分散; 每个任务映射到一个核心,并处理单个数据分区。因此,具有16个核心的执行器可以具有16个或更多任务并行工作于16个或更多分区上,使Spark任务的执行极其并行化!

Spark阶段创建一个或多个任务以分发给执行器

声明:内容摘自:学习Spark


1
一个拥有16个核心的执行器如何处理“超过”16个任务? - mkirzon
假设您有32个任务,前16个并行运行,然后每当这16个中的任何一个完成时,下一个任务(因此第17个任务将首先被选中)将由空闲的核心接管。 - sepandr

10

来自《一个开发者学习Apache Spark的7个步骤》

一个Spark应用程序的结构通常包含Spark操作,这些操作可以使用Spark的RDD、DataFrames或Datasets API在数据集上执行转换或动作。例如,在您的Spark应用程序中,如果您调用DataFrame或Dataset上的collect()或take()等操作,则该操作将创建一个作业。然后,作业将分解为单个或多个阶段;阶段进一步分为单个任务;而任务是Spark驱动程序调度器向Spark工作节点上的Spark Executors发送以在集群中执行的执行单元。通常,多个任务将在同一个执行者上并行运行,每个任务在其内存中处理其分区数据集单位。


10

我在Cloudera documentation中找到了一个非常好的定义。以下是要点。

在MapReduce中,计算的最高级别单元是作业。一个作业加载数据,应用map函数,进行洗牌操作,应用reduce函数,并将数据写回持久性存储。 但在Spark中,计算的最高级别单元是应用程序。Spark应用程序可以用于单个批处理作业、带有多个作业的交互式会话或长期运行的服务器,不断满足请求。Spark作业可能不仅包括单个map和reduce。


6
在Spark中,当调用spark-submit时,用户代码会被分成小的部分,称为作业(job)、阶段(stage)和任务(task)。
作业(Job) 一个作业是由一系列阶段(stage)组成的,由 Action 触发,例如.count()、foreachRdd()、collect()、read()或write()。
阶段(Stage) 一个阶段(stage)是一系列可以在没有 shuffle 的情况下一起并行运行的任务(task)。例如使用 .read 从磁盘读取文件,然后运行 .map 和 .filter 可以在没有 shuffle 的情况下完成,因此可以放在一个阶段中。
任务(Task) 一个任务(task)是应用于单个分区的单个操作(.map或.filter)。每个任务都作为单个线程在执行器中执行。如果数据集有2个分区,则诸如filter()之类的操作将触发2个任务,即每个分区一个任务。即任务在执行器上执行,其数量取决于分区数。1个分区需要1个任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接