容器因超出内存限制而被 YARN 杀死

Container killed by YARN for exceeding memory limits

我正在 google dataproc 中创建具有以下特征的集群:

Master Standard (1 master, N workers)
  Machine       n1-highmem-2 (2 vCPU, 13.0 GB memory)
  Primary disk  250 GB

Worker nodes    2
  Machine type  n1-highmem-2 (2 vCPU, 13.0 GB memory)
  Primary disk  size    250 GB

我还在 Initialization actions 添加来自这个 repository.sh 文件,以便使用 zeppelin。

我使用的代码可以很好地处理某些数据,但如果我使用更多数据,则会出现以下错误:

Container killed by YARN for exceeding memory limits. 4.0 GB of 4 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

我看过这样的帖子:Container killed by YARN for exceeding memory...,建议把yarn.nodemanager.vmem-check-enabled改成false

虽然我有点困惑。所有这些配置是否在我初始化集群时发生?

另外 yarn-site.xml 的具体位置在哪里?我无法在 master 中找到它(无法在 /usr/lib/zeppelin/conf//usr/lib/spark/conf/usr/lib/hadoop-yar/ 中找到它)以便更改它,如果更改了我需要什么 'restart'?

Igor 是正确的,最简单的方法是创建一个集群并在启动服务之前指定要设置的任何其他属性。

但是,完全禁用 YARN 检查容器是否在其范围内有点可怕。无论哪种方式,您的 VM 最终都会 运行 内存不足。

错误消息是正确的——您应该尝试提高 spark.yarn.executor.memoryOverhead。它默认为 max(384m, 0.1 * spark.executor.memory)。在 n1-highmem-2 上,自 spark.executor.memory=3712m 以来最终为 384m。您可以在使用 --properties spark:spark.yarn.executor.memoryOverhead=512m.

创建集群时设置此值

如果我理解正确的话,JVM 和 Spark 试图智能地将内存使用量保持在 spark.executor.memory - memoryOverhead 以内。然而,python 解释器(你的 pyspark 代码实际上 运行s)不在他们的会计范围内,而是属于 memoryOverhead。如果您在 python 进程中使用大量内存,则需要增加 memoryOverhead.

这里有一些关于 pyspark 和 Spark 内存管理的资源: