我正在使用hadoop集群运行Spark程序,该集群使用yarn调度程序来运行任务。然而,我注意到一个奇怪的行为。 Yarn 有时会杀死一个提示内存不足错误的任务,而如果我分轮执行任务,即执行与容器/执行器相同数量的任务,让它们完成,然后执行下一组任务,它运行良好,这意味着任务使用的内存不会超过容器中允许的内存。因此,我怀疑 yarn 试图在容器中并行运行多个任务,这就是容器内存不足的原因。有没有办法限制这种行为并告诉yarn在容器中一次只运行一个任务。
最佳答案
一般来说,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 容器;如果您想进一步限制每台机器一次执行 1 个任务,您还需要将 Spark.executor.memory 扩展为每台机器上的可用内存量(分配给在该机器上运行的 YARN NodeManager;YARN 将拒绝打包任何大于您告诉 NodeManager 它允许使用的容器,即使物理内存更大)。或者您可能会发现您只是需要将机器分割成稍大的 block ,因此您可以使用该内存设置来找到正确的内存大小,而无需牺牲太多的并行性。
关于scala - 限制 yarn 容器一次仅执行一项任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37998152/