Google Dataproc集群YARN内存超限问题及配置疑问
首先,先拆解你遇到的错误:
Container killed by YARN for exceeding memory limits. 4.0 GB of 4 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
这个错误说明你的Spark Executor总内存(堆内存 + 堆外内存)超过了YARN分配的容器物理内存上限。默认情况下,Spark的spark.yarn.executor.memoryOverhead是堆内存的10%,当处理大数据时,堆外内存(比如序列化对象、JNI调用、直接内存等)会占用额外空间,很容易触发这个限制。
接下来逐个解答你的疑问:
1. 这些配置是否必须在集群初始化时进行?
不是必须,但推荐在集群初始化时配置,这样配置会全局持久化生效,避免后续手动修改的麻烦:
- 创建集群时,可以通过
gcloud dataproc clusters create的--properties参数直接注入YARN和Spark的配置,比如:gcloud dataproc clusters create YOUR_CLUSTER_NAME \ --master-machine-type n1-highmem-2 \ --master-boot-disk-size 250GB \ --num-workers 2 \ --worker-machine-type n1-highmem-2 \ --worker-boot-disk-size 250GB \ --initialization-actions gs://path/to/your/zeppelin-init.sh \ --properties yarn:yarn.nodemanager.vmem-check-enabled=false,spark:spark.yarn.executor.memoryOverhead=2048 - 如果集群已经创建,也可以用
gcloud dataproc clusters update命令修改配置,同样会持久化生效:gcloud dataproc clusters update YOUR_CLUSTER_NAME \ --properties yarn:yarn.nodemanager.vmem-check-enabled=false,spark:spark.yarn.executor.memoryOverhead=2048
当然你也可以手动修改配置文件,但这种方式是临时的,集群重启或扩容后会失效,不推荐。
2. yarn-site.xml具体位于哪里?
在Dataproc集群中,YARN的核心配置文件yarn-site.xml统一放在所有节点的/etc/hadoop/conf/yarn-site.xml路径下。你之前找的/usr/lib/下的目录是软件安装路径,不是配置文件存放的位置。
不过要注意:不建议直接手动修改这个文件,因为Dataproc是通过集群属性来管理配置的,手动修改的内容可能会被系统覆盖,或者在新增节点时不生效。
3. 修改后需要重启什么服务?
- 如果是通过
gcloud dataproc clusters create或update命令修改配置,Dataproc会自动重启相关的YARN服务,不需要你手动操作。 - 如果是手动修改了
yarn-site.xml文件,需要在对应节点上重启YARN服务:- 主节点重启ResourceManager:
sudo systemctl restart hadoop-yarn-resourcemanager - 所有节点(主节点+工作节点)重启NodeManager:
sudo systemctl restart hadoop-yarn-nodemanager
- 主节点重启ResourceManager:
额外的优化建议
关闭虚拟内存检查(yarn.nodemanager.vmem-check-enabled=false)只是临时的 workaround,更根本的解决方法是调整Spark的内存参数:
- 提高
spark.yarn.executor.memoryOverhead:根据你的错误,建议把这个值设为2048MB(2GB)甚至更高,比如在提交Spark作业时添加:
这里把executor堆内存设为3GB,堆外内存设为2GB,总容器内存为5GB,刚好适配n1-highmem-2的13GB内存(每个节点可以跑2个executor,总内存占用10GB,剩下的3GB留给系统和其他服务)。spark-submit \ --conf spark.yarn.executor.memoryOverhead=2048 \ --conf spark.executor.memory=3g \ your-job.jar - 如果你用Zeppelin运行作业,可以在Zeppelin的Spark interpreter配置里添加这些
spark.yarn.executor.memoryOverhead参数,这样所有Zeppelin中的作业都会生效。
内容的提问来源于stack exchange,提问作者Mpizos Dimitris

