如何限制每个执行程序的并发映射任务数?

PC *_*Yin 4 mapreduce apache-spark

我的Spark APP中的一个map操作接受一个RDD[A]输入,并RDD[A]使用自定义映射函数func(x:A):B将每个元素映射到另一个B类型的对象.因为func()在计算每个输入时需要大量内存x,我想限制每个并发映射任务的数量执行程序,使得同一执行程序上的所有任务所需的内存总量不超过节点上可用的物理内存量.

我检查了可用的火花配置,但不确定使用哪一个.是否使用coalesce(numPartitions)设置分区数量来RDD[A]实现目的?

maa*_*asg 6

每个执行程序的并发任务数与可用的核心数有关,而不是任务数,因此使用coalescerepartition不会有助于限制每个任务的已用内存来改变并行度级别,只有每个分区上的数据量需要由给定任务(*)处理.

据我所知,没有办法约束单个任务使用的内存,因为它共享工作者JVM的资源,因此与同一个执行器上的其他任务共享内存.

假设每个任务的公平份额,每个任务(核心)可用内存量的指南将是:

spark.executor.memory * spark.storage.memoryFraction / #cores-per-executor
Run Code Online (Sandbox Code Playgroud)

也许,每个执行程序强制执行较少任务的方法,以及每个任务可用的更多内存,将是每个任务分配更多内核,使用spark.task.cpus(默认值= 1)

(*)鉴于此处的关注点位于xRDD 的每个元素的级别,唯一可能影响内存使用的设置是将并行度级别设置为小于单个执行程序的CPU数量,但这会导致集群资源严重不足,因为所有工人都会闲置.