前言
在我们提交spark程序时,应该如何为Spark集群配置–num-executors, - executor-memory和–execuor-cores 呢?
一些资源参数设置的基本知识
- Hadoop / Yarn / OS Deamons
当我们使用像Yarn这样的集群管理器运行spark应用程序时,会有几个守护进程在后台运行,如NameNode,Secondary NameNode,DataNode,JobTracker和TaskTracker等。因此,在指定num-executors时,我们需要确保为这些守护进程留下足够的核心(至少每个节点约1 CPU核)以便顺利运行。 - Yarn ApplicationMaster(AM)
ApplicationMaster负责协调来自ResourceManager的资源,并与NodeManagers一起执行container并监控其资源消耗。如果我们在YARN上运行Spark,那么我们需要预估运行AM所需要的资源(至少1024MB和1 CPU核)。 - HDFS吞吐量
HDFS客户端遇到大量并发线程会出现一些bug。一般来说,每个executors最多可以实现5个任务的完全写入吞吐量,因此最好将每个executors的核心数保持在该数量之下。 - MemoryOverhead
JVM还需要一些off heap的内存,请参考下图中描绘的Spark和YARN中内存属性的层次结构,
简单来说,有以下两个公式:
每个executor从YARN请求的内存 = spark-executor-memory + spark.yarn.executor.memoryOverhead |