首页 > 解决方案 > 执行器核心的数量和好处或其他 - Spark

问题描述

要求进行一些运行时说明。

在我读到的其他地方的一个线程中,有人说 Spark 执行器应该只分配一个核心。但是,我想知道这是否真的总是如此。阅读各种 SO 问题等,以及 Karau、Wendell 等人,很明显,有平等和相反的专家表示在某些情况下应该为每个 Executor 指定更多的核心,但讨论往往更多技术大于功能。也就是说,缺少功能示例。

我问这个,因为即使是这篇优秀的帖子How are stages split into tasks in Spark? 没有给出每个执行器多个核心的实际示例。我可以清楚地遵循这篇文章,它符合我对每个执行者 1 个核心的理解。

标签: apache-spark

解决方案


我的理解是由单个执行器服务的分区(...)。

这是正确的,但相反的情况并非如此——单个执行器可以跨多个阶段甚至多个 RDD 处理多个分区/任务)。

那么从分配的执行器运行更多核心中受益的例子是什么?

首先是同时处理多个任务。由于每个执行程序都是一个单独的 JVM,这是一个相对繁重的进程,因此最好只保留多个线程的实例。此外,它还可以提供更多优势,例如公开可跨多个任务使用的共享内存(例如存储广播变量)。

当用户调用多线程代码时,辅助应用程序将多个线程应用于单个分区。然而,这不是默认完成的(Spark 中每个任务的 CPU 数量

另请参阅在同一个 JVM 中运行多个 Spark 任务有什么好处?

如果 Spark 事先不知道分区数量等,为什么要这么早分配 Executor?

几乎可以扩展上述观点 - 执行程序不是为了处理特定任务/分区而创建的。有长时间运行的进程,只要不启用动态分配,就会持续相应应用程序/驱动程序的整个生命周期(抢占或失败,以及已经提到的动态分配,都会影响这一点,但那是基本模型)。


推荐阅读