我正在阅读一篇关于 Spark 中作业调度的论文,我对他们对 Spark 的概述感到困惑:
SparkSpark作业由一个DAG组成,其节点是作业的执行阶段。每个阶段代表系统在该阶段输入数据的许多分片上并行运行的操作。输入是一个或多个父阶段的输出,每个分片由单个任务处理。所有父阶段完成后,阶段的任务即可运行。可以并行运行多少个任务取决于作业拥有的执行器数量。通常,一个阶段的任务数量多于执行者数量,因此任务会分几次运行。执行器由 Spark master 根据用户请求进行分配,并且默认情况下会坚持执行作业直到作业完成。然而,Spark 还支持根据挂起任务的等待时间动态分配执行器 [9],尽管在作业之间移动执行器会产生一些开销(例如,拆除和启动 JVM)。
作业调度文档提到了应用程序之间执行器的静态与动态分配,所以听起来他们正在混合作业和应用程序。同时,他们正确地认识到作业是阶段的 DAG,并且他们后来提到他们将研究限制在单个应用程序内的作业调度。为什么“在工作之间移动执行者”会产生开销? JVM 真的需要为此重新启动吗? Tuning Spark 没有提及任何有关此开销的内容。
我希望得到一些澄清!