Apache spark 为什么web UI在作业和阶段页面中显示不同的持续时间?

Apache spark 为什么web UI在作业和阶段页面中显示不同的持续时间?,apache-spark,profiling,Apache Spark,Profiling,我正在运行一个虚拟spark作业,它在每次迭代中执行完全相同的一组操作。下图显示了30次迭代,其中每个作业对应一次迭代。可以看出,除作业0、4、16和28外,持续时间始终在70 ms左右。作业0的行为应与首次加载数据时相同。 但当我点击job 16进入其详细视图时,持续时间仅为64 ms,与其他作业类似,此持续时间的屏幕截图如下: 我想知道Spark在第16项工作上的(2000-64)毫秒是在哪里度过的?明白了!这正是我几天前问自己的问题。我很高兴与大家分享这些发现(希望当我幸运地了解到其他

我正在运行一个虚拟spark作业,它在每次迭代中执行完全相同的一组操作。下图显示了30次迭代,其中每个作业对应一次迭代。可以看出,除作业0、4、16和28外,持续时间始终在70 ms左右。作业0的行为应与首次加载数据时相同。

但当我点击job 16进入其详细视图时,持续时间仅为64 ms,与其他作业类似,此持续时间的屏幕截图如下:

我想知道Spark在第16项工作上的(2000-64)毫秒是在哪里度过的?

明白了!这正是我几天前问自己的问题。我很高兴与大家分享这些发现(希望当我幸运地了解到其他人的情况时,能够加入进来,填补空白)


在Jobs和Stages页面中可以看到的不同之处在于安排执行阶段所需的时间

在Spark中,单个作业可以有一个或多个阶段,其中包含一个或多个任务。这将创建一个执行计划

默认情况下,Spark应用程序在FIFO调度模式下运行,即一次执行一个Spark作业,而不管使用了多少内核(您可以在web UI的作业页面中进行检查)

引述:

默认情况下,Spark的调度程序以FIFO方式运行作业。每个作业分为“阶段”(例如,映射和缩减阶段),第一个作业在所有可用资源上获得优先级,而其阶段有任务要启动,然后第二个作业获得优先级,等等。如果队列前端的作业不需要使用整个集群,则以后的作业可以立即开始运行,但是,如果队列最前面的作业很大,则后面的作业可能会显著延迟

然后,您应该看到单个作业将执行多少任务,并将其除以Spark应用程序已分配的核心数(您可以在web UI的Executors页面中进行检查)

这将为您提供在所有任务(以及作业)完成之前可能需要等待多少“周期”的估计

注意:这就是动态分配的关键所在,因为有时您可能需要更多的内核,而开始时只需要很少的内核。当我们注意到类似的行为时,这就是我给我的客户的结论

我可以看到,您示例中的所有作业都有一个阶段和一个任务(这使得它们非常简单,在生产环境中非常不现实)。这告诉我,您的机器可能会在不同的时间间隔内变得更繁忙,因此Spark安排Spark作业所需的时间更长,但一旦安排了相应的阶段,相应的阶段就会像其他作业中的其他阶段一样完成。我要说的是,这是一种貌相之美,有时(通常?)可能变得非常不可预测和难以推理

只是为了让我们更清楚地了解web UI的工作原理。WebUI使用一组Spark侦听器来收集正在运行的Spark应用程序的当前状态。在web UI中,每页至少有一个Spark侦听器。它们根据各自的角色拦截不同的执行时间


阅读有关接口的内容,并查看不同的回调,以了解它们可以拦截的各种事件。

Cau是否发布您的代码?