Spark executor可以支持CPU核数以上的多线程吗?



我理解如果executor-cores设置为大于1,那么执行器将并行运行。但是,根据我的经验,执行器中的并行进程数总是等于执行器中的cpu数。

例如,假设我有一台48核的机器,并将executor-cores设置为4,那么将有12个执行器。

我们需要的是为每个执行器运行8个或更多线程(每个CPU 2个或更多线程)。原因是任务很轻,CPU使用率很低,只有10%左右,所以我们希望通过每个CPU多个线程来提高CPU使用率。

所以问我们是否可以在Spark配置中实现这一点。非常感谢!

Spark执行器是处理任务,这些任务派生自数据框架的执行计划/代码和分区。执行器上的每个核心始终只处理一个任务,因此每个执行器最多只能获得一个核心数量的任务数。在一个执行器中执行您所要求的更多任务是不可能的。您应该查找代码更改,尽量减少洗牌数量(没有内部连接;请使用Windows),并检查导致不均匀分布分区大小(数据框架分区,而不是存储分区)的数据倾斜。

警告:但是,如果您在集群上是单独的,并且不想更改代码,则可以更改服务器的YARN设置,并使用超过48个内核表示它,即使只有48个内核。这可能导致系统的严重不稳定,因为执行器现在共享cpu。(你的操作系统也需要CPU能力)

这个回答是对@Telijas的回答的补充,因为总的来说我同意它。它只是提供了一点点额外的信息。

有一些配置参数,您可以在其中设置Spark的某些部分的线程数。例如,在Spark文档中有一节讨论了其中的一些(对于所有这些,我正在查看写这篇文章时的最新Spark版本:版本3.3.1):

根据作业和集群配置,我们可以在Spark的几个地方设置线程数,以有效地利用可用资源来获得更好的性能。在Spark 3.0之前,这些线程配置适用于Spark的所有角色,如driver、executor、worker和master。从Spark 3.0开始,我们可以从驱动程序和执行程序开始配置更细粒度的线程。以RPC模块为例,如下表所示。对于其他模块,如shuffle,只需将属性名中的"rpc"替换为"shuffle",但spark.{driver|executor}.rpc.netty.dispatcher. numthreads除外,该属性仅适用于rpc模块。

tbody> <<tr>
属性名称 默认值 含义 自版本
火花。{司机执行人}.rpc.io。serverThreads退回到spark.rpc.io。serverThreads服务器线程池中使用的线程数
火花。{司机执行人}.rpc.io。clientThreads退回到spark.rpc.io。clientThreads客户端线程池中使用的线程数
spark.{driverexecutor}. RPC .netty.dispatcher. numthreads回到spark. RPC .netty.dispatcher. numthreadsRPC消息调度程序线程池中使用的线程数

最新更新