这里是转别人的博客,感谢作者的幸苦。

为的是说明spark on yarn的基本机制和参数

 

spark on yarn的那些事 ---第一篇

 

  1. 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 driverYARN 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的资源隔离机制。

 

 

这里是重点

  1. 运行在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对应的提交参数