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

来源:互联网 发布:电脑版扫描软件 编辑:程序博客网 时间:2024/06/09 21:05
  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 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的资源隔离机制。

  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上的任务。

     4. container中的内存使用情况大致是怎样的?
0 0