scala - 限制 yarn 容器一次仅执行一项任务

标签 scala hadoop apache-spark hadoop-yarn bigdata

我正在使用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/

相关文章:

scala - 激发多个上下文

scala - 如何模式匹配扩展多个特征的对象?

scala - 调用随机方法,而不是两次

scala - 如何使用 Spark 计算累积和

hadoop - Apache Oozie在创建mysql DB时抛出classnotfound异常

hadoop - 为什么Hive没有像MySQL那样封闭FIELDS?

scala - 斯卡拉结合笛卡尔乘积和 map

hadoop - 需要在Pig脚本中按1分钟过滤记录

apache-spark - Spark for Python - 无法将字符串列转换为十进制/ double

scala - 异常线程 "main"scala.MatchError :Map() (of class org. apache.spark.sql.catalyst.util.CaseInsensitiveMap)