这里是转别人的博客,感谢作者的幸苦。
为的是说明spark on yarn的基本机制和参数
spark on yarn的那些事 ---第一篇
- spark on yarn后一个spark application资源使用情况如何?
在不考虑动态分配spark资源的情况下: 一个spark application程序资源主要分为两部分:driver + executor,下面分别以client、cluster模式说明:
client模式:
spark driver启动在本地,而YARN Application Master启动在集群的某个节点中,所以要设置driver的资源必须要在启动时设定。AM仅用作资源管理。
driver资源:(因为是本地的JVM程序,并没有运行在容器中,不能做到cpu资源的隔离)
--driver-memory(也可以使用spark.driver.memory)
AM资源:
spark.yarn.am.cores
spark.yarn.am.memory
spark.yarn.am.memoryOverhead
executor资源:
spark.executor.cores
spark.executor.memory
spark.yarn.executor.memoryOverhead
spark.executor.instances
故而:
一个spark application所使用的资源为:
cores = spark.yarn.am.cores + spark.executor.cores * spark.executor.instances
memory = spark.yarn.am.memory + spark.yarn.am.memoryOverhead + (spark.executor.memory + spark.yarn.executor.memoryOverhead) * spark.executor.instances + --driver-memory
cluster模式:
spark driver和YARN Application Master运行在同一个JVM中,所以driver的资源参数也意味着控制着YARN AM的资源。
通过spark.yarn.submit.waitAppCompletion设置为false使spark client(运行在本地JVM中)提交完任务就退出,下面将不考虑其资源使用情况:
driver(AM)资源:
spark.driver.cores
spark.driver.memory
spark.yarn.driver.memoryOverhead
executor:
spark.executor.cores
spark.executor.memory
spark.yarn.executor.memoryOverhead
spark.executor.instances
故而:
一个spark application所使用的资源为:
cores = spark.driver.cores + spark.executor.cores * spark.executor.instances
memory = spark.driver.memory + spark.yarn.driver.memoryOverhead + (spark.executor.memory + spark.yarn.executor.memoryOverhead) * spark.executor.instances
总上所述:
client模式,AM和executor运行在yarn的container中;cluster模式,AM(和spark driver共享JVM)executor运行在yarn的container中,可以享用container的资源隔离机制。
这里是重点
- 运行在yarn container中的程序资源域值如何?
首先,运行在yarn container中的程序,其可使用的资源域值受container限制,即:
each container mem:
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
each container vcore:
yarn.scheduler.minimum-allocation-vcores
yarn.scheduler.maximum-allocation-vcores
PS:
每个物理节点上的可以被nodemanager管理的资源受限于
total container mem:
yarn.nodemanager.resource.memory-mb
total container vcore:
yarn.nodemanager.resource.cpu-vcores(无法限制yarn可以管理的vcore,只是表示这么多vcore可以用于RM scheduler分配给container的)
必须保证这些值大于单个container的资源使用值。
其次,运行在yarn container中的程序,其可使用的资源域值受自身参数限制。比如说spark的进程要求最小内存512MB,分配到1个core。
3. 分配给executor的core是如何被使用的?
private val tasksPerExecutor = conf.getInt("spark.executor.cores", 1) / conf.getInt("spark.task.cpus", 1)
executor将她拥有的全部core,按照每一个任务需要的core数目,分配给这个executor上的任务。
下面是我个人的一点总结::
对应的cpu和内存的设置,一定不能超过父级角色的资源限制。
1、container是运行在nodemanager节点中的,所以其资源配置不能大于节点设置的可用资源值。
2、task任务是运行在container中的,所以每个task资源配置不能大于container设置的可用资源值。一个container中可以运行多个task任务。
3、spark on yarn模式多了一个executor在container中运行task。所以executor受到container的资源限制。
以上限制用参数表示:
( spark.yarn.executor.memoryOverhead + spark.executor.memory )
spark.executor.cores ) > yarn.scheduler.maximum-allocation-mb
标记颜色的是spark对应的提交参数