YARN 未使用 Google Dataproc 实例中的所有可用内存

YARN not using all memory available in a Google Dataproc instance

我是 运行 使用 h1-highmem-16 机器的 Dataproc 作业,每台机器都有 104 GB 内存。

我在 Google 控制台中仔细检查了实例的大小,所有的工人和主人确实是 h1-highmem-16

然而,我得到这个错误:

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

为什么 YARN 没有使用全部 104 GB 内存?

Dataproc 配置内存设置以适应每台机器 2 个 Spark 执行器,因此每个容器应该是每个 NodeManager 容量的一半。

您可以选择性地覆盖 spark.executor.memoryspark.yarn.executor.memoryOverhead 以及 spark.executor.cores 以更改将执行程序打包到每台机器上的方式。 spark.executor.cores 将默认为机器内核的一半,因为机器内存的一半分配给每个执行程序。在您的情况下,这意味着每个 Spark 执行程序尝试在同一进程中并行执行 运行 8 个任务。

您可以通过减少执行程序内核但保持其他所有内容不变来有效地增加 memory-per-task,例如 spark.executor.cores=6 将增加 per-task 内存 33%,即使您保留其他所有内容相同的。这些可以在 job-submission 时间指定:

gcloud dataproc jobs submit spark --properties spark.executor.cores=6

即使在高内存实例上有可用的物理内存,我仍收到“容器因超出内存限制而被 YARN 杀死”异常。

我必须在创建集群时添加“yarn.nodemanager.vmem-check-enabled=false”

 gcloud beta dataproc clusters create highmem-cluster --properties="yarn:yarn.nodemanager.vmem-check-enabled=false" ...

随后我能够 运行 在 n1-highmem-16

上具有以下执行器大小的作业
spark.executor.cores=15,spark.executor.memory=70g