Spark on Yarn模式下的资源分配

导读:本篇文章讲解 Spark on Yarn模式下的资源分配,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Spark程序以Hadoop Yarn作为集群管理器时,运行时所需资源的分配完全由Hadoop Yarn
进行管理,相关的配置参数也分成Spark本身以及Hadoop Yarn两部分。
以下配置以Spark-1.6.0和Hadoop 2.6.0为标准,部署模式为yarn-cluster。(client模式下个别参数会有区别
主要是涉及到driver的参数应该替换为am)

Spark配置参数

内存配置参数

spark.executor.memory  # 每个Spark Executor占用的内存数量(e.g. 1g, 512m)
spark.driver.memory    # Spark Driver占用的内存数量(e.g. 1g, 512m)
spark.yarn.executor.memoryOverhead # 每个executor额外的堆外内存(off-heap),用于VM以及本地代码的一些开销
spark.yarn.driver.memoryOverhead # driver额外的堆外内存(off-heap),用于VM以及本地代码的一些开销

cpu配置参数

spark.executor.cores  # 每个Spark Executor使用的cpu cores数量
spark.driver.cores    # Spark Driver使用的cpu cores数量

executor数量参数

spark可以设置每个spark应用所使用的executor数量,可以动态进行分配也能够设置为固定的数量:

spark.executor.instances  # 固定分配的executor数量,如果spark.dynamicAllocation.enabled为true,该配置将失效
spark.dynamicAllocation.enabled # 根据负载情况动态调整application的executor数量,以下设置需要该设置启用后才会生效
spark.dynamicAllocation.initialExecutors # 任务初始分配的executor数量
spark.dynamicAllocation.minExecutors # 最小分配的executor数量
spark.dynamicAllocation.maxExecutors # 最大分配的executor数量

Hadoop yarn配置参数

内存配置参数

yarn.nodemanager.resource.memory-mb #每个nodemanager可用的内存资源
yarn.scheduler.minimum-allocation-mb #每个Yarn上运行的Container最分配的内存数(Spark Application中的Driver、Executor都会被封装为Container)
yarn.scheduler.maximum-allocation-mb #每个Container最大分配的内存数

cpu配置参数

yarn.nodemanager.resource.cpu-vcores #每个nodemanager可用的cpu虚拟内核数量
yarn.scheduler.minimum-allocation-vcores # 每个Container最小分配的虚拟内核数量
yarn.scheduler.maximum-allocation-vcores # 每个Container最大分配的虚拟内核数量

总结

  1. 集群中所有可分配的资源数为:
cores:  yarn.nodemanager.resource.cpu-vcores*n
memory: yarn.nodemanager.resource.memory-mb*n

其中n为Hadoop Yarn集群中的NodeManager数量

  1. 每个的Container消耗的cpu cores为:
numOfCoresPerContainer = spark.executor.cores*numOfExecutor + spark.driver.cores*1

其中numOfExecutor为Spark设置的执行器数量,如果设置为动态分配(spark.dynamicAllocation.enabled=true)
则其值在spark.dynamicAllocation.minExecutors和spark.dynamicAllocation.maxExecutors之间。spark.executor.cores和spark.driver.cores设置的值不能超过yarn.scheduler.minimum-allocation-vcores、
yarn.scheduler.maximum-allocation-vcores所规定的范围,否则其值将被强制修改为边界值。

  1. 每个的Container所消耗的内存数量为:
numOfMemsPerContainer = (spark.executor.memory+spark.yarn.executor.memoryOverhead)*numOfExecutor+(spark.driver.memory+spark.yarn.driver.memoryOverhead)*1

内存分配的情况更为复杂一些,需要结合多个参数进行考虑:

  • spark.executor.memory和spark.driver.memory都要满足{yarn.scheduler.minimum-allocation-mb,
    yarn.scheduler.maximum-allocation-mb}的约束,这个和cores分配是一样的;
  • spark.yarn.executor.memoryOverhead spark.yarn.driver.memoryOverhead都是会动态增长的,设置的值仅为最小阙值,
    实际值大概等于executorMemory或driverMemory * 0.10;
  • Yarn进行资源分配时,所分配的最小单位等于yarn.scheduler.minimum-allocation-mb所规定的值,意味着如果container所申请的内存
    数一定等于yarn.scheduler.minimum-allocation-mb的倍数,比如yarn.scheduler.minimum-allocation-mb为1G,而计算出的container需要分配的内存为1.5G,则实际会按照2G进行分配。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15729.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!