我正在使用h1-highmem-16
每台内存为104 GB的计算机运行Dataproc作业.
我仔细检查了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.memory
,也可以spark.yarn.executor.memoryOverhead
同时spark.executor.cores
更改将执行程序打包到每台计算机上的方式.spark.executor.cores
默认为机器核心的一半,因为机器的一半内存被给予每个执行器.在您的情况下,这意味着每个Spark执行程序都尝试在同一进程中并行运行8个任务.
您可以通过减少执行程序核心来有效地增加每个任务的内存,但保持其他所有内容相同,例如,spark.executor.cores=6
即使您将其他所有内容保持不变,每个任务内存也会增加33%.这些可以在工作提交时指定:
gcloud dataproc jobs submit spark --properties spark.executor.cores=6