mapreduce - 如何限制每个执行器并发map任务的数量?

标签 mapreduce apache-spark

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

我检查了可用的 Spark 配置,但不确定使用哪一个。使用coalesce(numPartitions)设置RDD[A]的分区数量是否可以达到目的?

最佳答案

每个执行器的并发任务数与可用核心数有关,而不是与任务数有关,因此使用 coalescerepartition 更改并行级别不会有助于限制每个任务使用的内存,仅限制给定任务需要处理的每个分区上的数据量 (*)。

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

假设每个任务公平共享,每个任务(核心)可用内存量的指导原则为:

spark.executor.memory * spark.storage.memoryFraction / #cores-per-executor

强制每个执行程序执行更少的任务,从而为每个任务提供更多可用内存的一种方法可能是使用 spark.task.cpus(默认 = 1)为每个任务分配更多内核

(*) 鉴于这里关注的是 RDD 的每个元素 x 的级别,唯一可能影响内存使用的设置是将并行级别设置为小于单个执行器的 CPU,但这会导致集群资源的严重利用不足,因为除了其中一个工作器外,所有工作器都会空闲。

关于mapreduce - 如何限制每个执行器并发map任务的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27738186/

相关文章:

apache-spark - Spark 行编码器 : empty metadata

java - 如何将仅包含标题(无行)的数据集写入 hdfs 位置(csv 格式),以便在下载时包含标题?

hadoop - 无法获取系统目录 - hadoop

hadoop - 如何将非jar文件分发到yarn节点?

Hadoop 集群 - 如何知道每个 tasktracker 的理想最大 map/reduce 任务数

apache-spark - Web UI 如何计算存储内存(在 Executors 选项卡中)?

Java : Spark iterate through custom objects

hadoop负载均衡

hadoop - Mapreduce-确认文件是否已拆分的正确方法

hadoop - 如何编写脚本以在centos中启动多个服务?