接下来,我们假设每个时间点仅运行一个Spark作业。
我到目前为止所得到的
这是我了解Spark会发生的情况:
- 当
SparkContext
被创建,每个工作节点开始执行人。执行程序是单独的进程(JVM),它们连接回驱动程序。每个执行程序都有驱动程序的jar。退出驱动程序,关闭执行程序。每个执行程序可以容纳一些分区。 - 执行作业时,根据沿袭图创建执行计划。
- 执行作业分为多个阶段,其中的阶段包含(在沿袭图中)尽可能多的相邻转换和动作,但没有混洗。因此,各个阶段被随机播放分开。
我明白那个
- 任务是通过序列化Function对象从驱动程序发送给执行程序的命令。
- 执行程序反序列化(使用驱动程序jar)命令(任务)并在分区上执行。
但
问题
我如何将阶段划分为这些任务?
特别:
- 任务是由转换和动作确定的还是一个任务中可以有多个转换/动作?
- 任务是否由分区确定(例如,每个分区每个阶段每个任务一个)。
- 任务是否由节点确定(例如,每个节点每个阶段一个任务)?
我的想法(即使是正确的,也只能部分回答)
在https://0x0fff.com/spark-architecture-shuffle中,随机播放与图片一起说明
我觉得规则是
每个阶段都分为#number-of-partitions个任务,不考虑节点数量
对于我的第一张图片,我会说我要执行3个贴图任务和3个缩小任务。
对于来自0x0fff的图像,我想说有8个地图任务和3个缩小任务(假设只有三个橙色和三个深绿色文件)。
在任何情况下都可以提问
那是对的吗?但是即使那是正确的,我的上述问题也没有全部回答,因为它仍然是开放的,是一项任务中包含多个操作(例如,多个地图)还是一项操作被分为一个任务。
别人怎么说
Spark中的任务是什么?Spark worker如何执行jar文件?而如何在Apache星火调度分割文件转换成任务?相似,但是我不觉得我的问题在那儿得到了清晰的回答。