我的Spark APP中的地图操作将RDD[A]
作为输入,并使用自定义映射函数RDD[A]
将func(x:A):B
中的每个元素映射到另一个类型为B的对象。因为{{1在计算每个输入func()
时需要大量内存,我想限制每个执行程序的并发映射任务的数量,使得同一执行程序上的所有任务所需的内存总量不超过节点上可用的物理内存。
我检查了可用的火花配置,但不确定使用哪一种。使用x
设置coalesce(numPartitions)
的分区数是否符合目的?
答案 0 :(得分:6)
每个执行程序的并发任务数与可用核心数有关,而不是任务数,因此使用coalesce
或repartition
更改并行度级别将无助于限制已用内存对于每个任务,只需要给定任务(*)需要处理的每个分区上的数据量。
据我所知,没有办法限制单个任务使用的内存,因为它共享工作者JVM的资源,因此与同一执行程序上的其他任务共享内存。
假设每个任务的公平份额,每个任务(核心)可用内存量的准则将是:
spark.executor.memory * spark.storage.memoryFraction / #cores-per-executor
可能使用spark.task.cpus
(默认值= 1)
(*)鉴于此处关注的是RDD的每个元素x
的级别,唯一可能影响内存使用的设置是将并行度级别设置为小于a的CPU数量单个执行程序,但这会导致集群资源严重不足,因为所有工作人员都会闲置。