我正在运行一个使用hadoop集群的spark程序,它使用yarn调度器来运行任务。然而,我注意到一个奇怪的行为。yarn有时会杀死一个抱怨内存不足错误的任务,而如果我轮次执行任务,也就是说,执行与容器/执行器相同数量的任务,让它们完成,然后执行下一组任务,它运行良好,这意味着任务使用的内存不会超过容器中允许的内存。所以,我怀疑yarn试图在一个容器中并行运行多个任务,这就是容器内存不足的原因。有没有办法限制这种行为并告诉yarn在容器中一次只运行一个任务。
pieyvz9o1#
一般来说,spark请求的每个Yarn容器直接对应一个“执行器”,即使Yarn可能会报告每个容器分配的1个cpu,但在引擎盖下spark使用 spark.executor.cores 用于确定打包到单个执行器/容器进程中的并发任务数的设置。所以就简单的设定 spark.executor.cores=1 每个Yarn容器一次只能处理一个任务。这可以作为 spark-submit 配置类似 --conf spark.executor.cores=1 或者你可以把它放进去 conf/spark-defaults.conf (在大多数标准hadoop安装中,这都是在 /etc/spark/conf/spark-defaults.conf ).请注意,每台机器可能仍有多个Yarn容器;如果要进一步限制每台机器一次只能执行一个任务,还需要扩展 spark.executor.memory 为每台机器上可用的内存量(分配给在该机器上运行的Yarn节点管理器);Yarn将拒绝 Package 任何大于您告诉节点管理员允许使用的容器(即使物理内存更大)。或者您可能会发现,您只需要将机器分割成稍大的块,这样您就可以在不牺牲太多并行性的情况下使用该内存设置来找到合适的内存大小。
spark.executor.cores
spark.executor.cores=1
spark-submit
--conf spark.executor.cores=1
conf/spark-defaults.conf
/etc/spark/conf/spark-defaults.conf
spark.executor.memory
1条答案
按热度按时间pieyvz9o1#
一般来说,spark请求的每个Yarn容器直接对应一个“执行器”,即使Yarn可能会报告每个容器分配的1个cpu,但在引擎盖下spark使用
spark.executor.cores
用于确定打包到单个执行器/容器进程中的并发任务数的设置。所以就简单的设定
spark.executor.cores=1
每个Yarn容器一次只能处理一个任务。这可以作为spark-submit
配置类似--conf spark.executor.cores=1
或者你可以把它放进去conf/spark-defaults.conf
(在大多数标准hadoop安装中,这都是在/etc/spark/conf/spark-defaults.conf
).请注意,每台机器可能仍有多个Yarn容器;如果要进一步限制每台机器一次只能执行一个任务,还需要扩展
spark.executor.memory
为每台机器上可用的内存量(分配给在该机器上运行的Yarn节点管理器);Yarn将拒绝 Package 任何大于您告诉节点管理员允许使用的容器(即使物理内存更大)。或者您可能会发现,您只需要将机器分割成稍大的块,这样您就可以在不牺牲太多并行性的情况下使用该内存设置来找到合适的内存大小。