我正在运行一个虚拟火花作业,它在每次迭代中执行完全相同的操作集。下图显示了30次迭代,其中每个作业对应一次迭代。可以看出,除了作业0,4,16和28之外,持续时间总是大约70ms。作业0的行为与数据首次加载时的行为相同。
但是当我点击作业16进入其详细视图时,持续时间仅为64毫秒,这与其他作业类似,此持续时间的屏幕截图如下:
我想知道Spark在工作16上花了哪些(2000 - 64)ms?
答案 0 :(得分:1)
Gotcha!这就是我问自己几天前的问题。我很高兴与您分享这些发现(希望当我能够理解其他人的时候,填补空白并填补空白)。
您可以在“作业”和“阶段”页面中看到的内容之间的差异是安排执行阶段所需的时间。
在Spark中,单个作业可以包含一个或多个具有一个或多个任务的阶段。这创建了一个执行计划。
默认情况下,Spark应用程序在FIFO调度模式下运行,无论正在使用多少核心,都可以一次执行一个Spark作业(您可以在Web UI的“作业”页面中进行检查)。 / p>
引用Scheduling Within an Application:
默认情况下,Spark的调度程序以FIFO方式运行作业。每项工作分为"阶段" (例如映射和减少阶段),第一个作业获得所有可用资源的优先级,同时其阶段具有要启动的任务,然后第二个作业获得优先权等。如果队列头部的作业不需要使用整个集群,以后的工作可以立即开始运行,但如果队列头部的工作量很大,那么以后的工作可能会大大延迟。
然后,您应该看到单个作业将执行多少任务,并将其除以Spark应用程序分配的核心数(您可以在Web UI的“执行者”页面中进行检查)。
这将给你估计有多少"周期"您可能需要等待所有任务(以及作业)完成。
注意:那是动态分配到达舞台的地方,因为您有时可能需要更多内核,并且只需要很少的内核。当我们注意到类似的行为时,这就是我向客户提供的结论。
我可以看到你的例子中的所有工作都有1个阶段和1个任务(这使得它们在生产环境中非常简单且非常不现实)。这告诉我你的机器可能在不同的时间间隔变得更加繁忙,因此Spark调度Spark工作的时间更长,但是一旦安排,相应的阶段就完成了其他工作的其他阶段。我说这是一种形象之美,它有时(经常?)变得非常不可预测且难以推理。
只是为了更好地了解Web UI的工作原理。 Web UI使用一组Spark侦听器来收集正在运行的Spark应用程序的当前状态。 Web UI中每页至少有一个Spark侦听器。它们根据角色截取不同的执行时间。
阅读org.apache.spark.scheduler.SparkListener界面并查看不同的回调,了解他们可以拦截的各种事件。