Spark on Yarn模式下的资源分配

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进行分配。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值