我理解如果executor-cores
设置为大于1,那么执行器将并行运行,但是根据我的经验,执行器中并行进程的数量总是等于执行器中CPU的数量。
例如,假设我有一台48核的机器,并将executor-cores
设置为4,那么将有12个执行器。
我们需要为每个执行器运行8个或更多线程(因此每个CPU运行2个或更多线程),原因是该任务非常轻,CPU使用率非常低,大约为10%,因此我们希望通过每个CPU运行多个线程来提高CPU使用率。
所以问一下我们是否有可能在Spark配置中实现这一点。非常感谢!
2条答案
按热度按时间vxf3dgd41#
Spark执行器正在处理任务,这些任务是从执行计划/代码和 Dataframe 的分区中派生出来的。执行器上的每个内核总是只处理一个任务,因此每个执行器最多只能获得内核数量的任务数。在一个执行器中拥有您所要求的更多任务是不可能的。您应该查找代码更改,最小化shuffle的数量(没有内部连接;使用窗口),并检查数据中导致分区大小分布不均匀( Dataframe 分区,而不是存储分区)的偏差。
警告:如果您在群集上是单独一个人,并且不想更改代码,则可以更改服务器的YARN设置,并使用超过48个核心来表示它,即使只有48个核心。这可能会导致系统严重不稳定,因为执行器现在共享CPU。(您的操作系统也需要CPU能力。)
u3r8eeie2#
这个答案是对@Telijas答案的补充,因为大体上我同意这个答案。它只是提供了一点点额外的信息。
有一些配置参数可以用来设置Spark某些部分的线程数,例如,Spark文档中有一个部分讨论了其中的一些配置参数(在写这篇文章的时候,我正在看最新的Spark版本:* * 版本3.3.1**):
根据作业和集群配置,我们可以在Spark的几个地方设置线程数量,以有效地利用可用资源,从而获得更好的性能。在Spark 3.0之前,这些线程配置适用于Spark的所有角色,如驱动程序、执行器、工作者和主机。我们可以从驱动程序和执行器开始以更细的粒度配置线程。2以RPC模块为例如下表所示。3对于其他模块,如shuffle,只需要在属性名称中用"shuffle"替换"rpc",spark除外。{driver| executor}. rpc. netty. dispatcher. numThreads,它只用于RPC模块。
| 属性名称|默认值|意义|自版本|
| - ------| - ------| - ------| - ------|
| Spark。{司机|执行程序}. rpc. io.服务器线程|回到spark. rpc. io.服务器线程|服务器线程池中使用的线程数|
| Spark。{司机|执行程序}. rpc. io.客户端线程|回退到spark. rpc. io.客户端线程|客户端线程池中使用的线程数|
| Spark。{司机|执行程序}. rpc. netty.调度程序.数目个线程|回退到spark. rpc. netty. dispatcher. numThreads| RPC消息调度程序线程池中使用的线程数|
下面是一些其他与线程数相关的配置参数的列表(没有特定顺序的非详尽列表,只是浏览了源代码):
spark.storage.decommission.shuffleBlocks.maxThreads
spark.shuffle.mapOutput.dispatcher.numThreads
spark.shuffle.push.numPushThreads
spark.shuffle.push.merge.finalizeThreads
spark.rpc.connect.threads
spark.rpc.io.threads
spark.rpc.netty.dispatcher.numThreads
(将被上表中特定于驱动程序/执行程序的参数覆盖)spark.resultGetter.threads
spark.files.io.threads
我没有把这些参数的含义加到这个答案中,因为这是一个不同的问题,而且很"谷歌"。这只是作为一个额外的信息位的意思。