Mapreduce 如何限制每个执行者并发映射任务的数量?
我的Spark应用程序中的映射操作将Mapreduce 如何限制每个执行者并发映射任务的数量?,mapreduce,apache-spark,Mapreduce,Apache Spark,我的Spark应用程序中的映射操作将RDD[A]作为输入,并使用自定义映射函数func(x:A):B将RDD[A]中的每个元素映射到另一个类型为B的对象。因为func()在计算每个输入x时需要大量内存,我想限制每个执行器并发映射任务的数量,以便同一执行器上所有任务所需的内存总量不超过节点上可用的物理内存量 我检查了可用的spark配置,但不确定要使用哪种配置。使用coalesce(numPartitions)设置RDD[A]的分区数是否达到了目的?每个执行器的并发任务数与可用的内核数有关,而不是
RDD[A]
作为输入,并使用自定义映射函数func(x:A):B
将RDD[A]
中的每个元素映射到另一个类型为B的对象。因为func()
在计算每个输入x
时需要大量内存,我想限制每个执行器并发映射任务的数量,以便同一执行器上所有任务所需的内存总量不超过节点上可用的物理内存量
我检查了可用的spark配置,但不确定要使用哪种配置。使用
coalesce(numPartitions)
设置RDD[A]
的分区数是否达到了目的?每个执行器的并发任务数与可用的内核数有关,而不是与任务数有关,因此,使用coalesce
或repartition
更改并行度级别无助于限制每个任务的已用内存,只会限制每个分区上需要由给定任务处理的数据量(*)
据我所知,无法限制单个任务使用的内存,因为它共享工作JVM的资源,因此与同一执行器上的其他任务共享内存
假设每个任务有一个公平的共享,每个任务(核心)可用内存量的指导原则是:
spark.executor.memory * spark.storage.memoryFraction / #cores-per-executor
可能,强制每个执行器执行更少的任务,从而使每个任务具有更多可用内存的一种方法是使用spark.task.cpu
(默认值=1)为每个任务分配更多的内核
(*)考虑到此处关注的是RDD的每个元素
x
的级别,唯一可能影响内存使用的设置是将并行级别设置为小于单个执行器的CPU数量,但这将导致严重的群集资源利用率不足,因为除一个工作线程外,所有工作线程都将处于空闲状态。谢谢您的回答,我将尝试一下。但是,更改spark.task.cpu将对所有任务生效。如果我想为一个特定的map()
操作更改其值,该怎么办?在我看来,将spark.task.cpu
设置为number>1将在全局范围内生效。同时,我认为如果我们首先调用RDD.coalesce(#u of_节点)
来确保每个节点都获得RDD的一个分区,然后调用RDD.repartition()
来提高消耗map()
操作后的并行度,那么coalesce()将是一个更好的选择(#of_nodes)
将确保1个任务/节点,除非您只有1个cpu/节点。假设您有4个节点,每个节点有4个cpu。执行rdd.coalesce(4)
时,一个节点有足够的容量(cpu)处理RDD的所有分区。这也将使所有其他3个节点处于空闲状态。我想这不是您想要的。spark.task.cpu
也是一种黑客行为,会影响整个工作;我同意。@maasg如何在spark中设置spark.task.cpu属性??您能找到解决方案吗?我们也陷入了同样的困境。