【发布时间】:2016-09-28 10:10:48
【问题描述】:
我们假设在每个时间点只有一个 Spark 作业在运行。
到目前为止我得到了什么
以下是我对 Spark 的理解:
- 创建
SparkContext时,每个工作节点都会启动一个执行程序。 执行器是独立的进程 (JVM),连接回驱动程序。每个执行器都有驱动程序的 jar。退出驱动程序,关闭执行程序。每个执行者可以持有一些分区。 - 执行作业时,会根据沿袭图创建执行计划。
- 执行作业分为多个阶段,其中阶段包含尽可能多的相邻(在沿袭图中)转换和操作,但没有洗牌。因此,各个阶段由 shuffle 分隔。
我明白了
- 任务是通过序列化 Function 对象从驱动程序发送到执行程序的命令。
- 执行程序反序列化(使用驱动程序 jar)命令(任务)并在分区上执行。
但是
问题
如何将阶段拆分为这些任务?
具体来说:
- 任务是由转换和操作确定还是可以是多个转换/操作在一个任务中?
- 任务是否由分区确定(例如,每个分区每个阶段一个任务)。
- 任务是否由节点决定(例如,每个节点每个阶段一个任务)?
我的想法(只是部分答案,即使是对的)
在https://0x0fff.com/spark-architecture-shuffle中,用图片解释了shuffle
我觉得规则是
每个阶段分为#number-of-partitions 个任务,不考虑节点数
对于我的第一张图片,我会说我有 3 个 map 任务和 3 个 reduce 任务。
对于来自 0x0fff 的图像,我会说有 8 个 map 任务和 3 个 reduce 任务(假设只有三个橙色和三个深绿色文件)。
任何情况下的开放式问题
正确吗?但即使那是正确的,我上面的问题也没有全部回答,因为它仍然是开放的,多个操作(例如多个地图)是在一个任务中还是每个操作被分成一个任务。
别人怎么说
What is a task in Spark? How does the Spark worker execute the jar file? 和How does the Apache Spark scheduler split files into tasks? 很相似,但我觉得我的问题在那里没有得到明确的回答。
【问题讨论】:
-
如果您能添加更多见解,我将不胜感激,我也有类似的问题。
-
@Nag:我的问题也在寻找更多见解,这就是我问的原因:-)。答案是否提供了您在哪里寻找的东西?您需要什么样的见解?
-
啊,明白了。我想,既然这个问题发布得有点老,也许你会对你提出的问题有一些见解。想和你核实一下:-)
-
@Nag:嗯,自从我上次使用 Spark 以来已经有好几年了,所以 a) 如果我想知道 Spark 是如何工作的,我必须再次阅读它(我忘了大多数细节)和b)我写的内容可能已经过时了,特别是因为我的帖子主要涉及Spark 1.x,并且Spark 2.x发生了很多变化,afai记得。但也许与后端架构无关的变化 - 这也可能是真的。
-
太棒了。谢谢!!
标签: apache-spark