spark on yarn参数设置

前言

上次提交任务都是采用默认参数提交的,结果运行时查看计算机状况使用的,没有最大限度的使用到计算机资源,于是这次提交任务就简单的了解了一下参数设置方面的问题,做个简单的记录。本文spark是提交到yarn上执行的,所有仅限于spark on yarn 运行模式。

问题

查看spark官网,提交yarn任务命令如下;To launch a Spark application in cluster mode:

$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]

For example:

$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi
--master yarn
--deploy-mode cluster
--num-executors 5
--executor-memory 2g
--executor-cores 1
--queue thequeue
examples/jars/spark-examples*.jar
10

其中num-executors、executor-memory、executor-cores参数代表什么意思,如何设置大小哪?

1.yarn 参数设置

因为spark是运行在yarn上的,因此我们需要首先弄明白hadoop yarn资源分配相关的参数,在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责资源的分配,而NodeManager则负责资源的供给和隔离,将cpu、内存等包装称container,一个container代表最小计算资源。

ResourceManager将某个NodeManager上资源分配给任务(这就是所谓的“资源调度”)后,NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的资源隔离。

yarn中可以通过yarn-site.xml中设置如下几个参数达到管理内存的目的:

  • yarn.nodemanager.resource.memory-mb 默认值:8192M NM总的可用物理内存,以MB为单位。一旦设置,不可动态修改
  • yarn.nodemanager.resource.cpu-vcores 默认值:8 可分配的CPU个数
  • yarn.scheduler.minimum-allocation-mb 默认值:1024 可申请的最少内存资源,以MB为单位
  • yarn.scheduler.maximum-allocation-mb 默认值:8192 可申请的最大内存资源,以MB为单位
  • yarn.scheduler.minimum-allocation-vcores 默认值:1 可申请的最小虚拟CPU个数
  • yarn.scheduler.maximum-allocation-vcores 默认值:32 可申请的最 大虚拟CPU个数

yarn.nodemanager.resource.memory-mb与yarn.nodemanager.resource.cpu-vcores的值不会根据系统资源自动设置,需要手动设置,如果系统内存小于8G 、cpu小于8个,最好手动设置

2.spark 参数设置

spark 执行任务是executor,一个executor可以运行多个task。一个Executor对应一个JVM进程。从Spark的角度看,Executor占用的内存分为两部分:ExecutorMemory和MemoryOverhead。 spark 中与设置Executor资源相关的参数如下 参考spark官网:

  • spark.driver.memory 默认值:1g ; 分配给driver process的jvm堆内存大小,SparkContext将会在这里初始化,命令行中可通过 --driver-memory指定,也可通过配置文件指定一个固定值
  • spark.driver.cores 默认值:1 ; 分配给driver process的核心数量,只在cluster模式下
  • spark.driver.memoryOverhead 默认值:driverMemory * 0.10, with minimum of 384; 用于driver process的启停jvm内存大小
  • spark.executor.cores 默认值:1 ; 分配给executor process的核心数量,命令行中可通过 executor-cores指定
  • spark.executor.memory 默认值:1g ; 分配给每个executor的程序的内存大小,命令行中可通过 --executor-memory指定
  • spark.executor.memoryOverhead 默认值:executorMemory * 0.10, with minimum of 384; jvm非堆内存的开销,一般占max(executorMemory *10%,384M)大小

3.Spark On YARN资源分配策略

当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器运行。Spark可以使得多个Tasks在同一个容器里面运行。

  • 1.对于集群中每个节点首先需要找出nodemanager管理的资源大小,总的资源-系统需求资源-hbase、HDFS等需求资源=nodemanager管理资源
  • 2.划分内存资源,有上文中jvm资源需求等于executor.memory(JVM堆资源)+executor.memoryOverhead(JVM非堆需要资源),也就是一个executor需要的内存资源=--executor-memory+max(executorMemory *10%,384M)。同时这个值需要通过yarn申请,必须落在minimum-allocation-mb与maximum-allocation-mb之间
  • 3.划分cpu资源,通过executor.cores指定executor可拥有的cpu个数,也就是task可并行运行的个数,一般小于5
  • 4 计算executor个数。设置num-executors

对于client模式:nodemanager管理资源>=executor个数executor资源(内存+cpu) 对于cluster模式:nodemanager管理资源>=executor个数executor(内存+cpu)+driver资源(内存+cpu)

4.示例分析(cluster模式下,并且设置driver与executor资源大小相同)

假设3个节点的集群, CPU 8核 ,内存 8G

(1)nodemanager管理的资源大小,去除系统需求,以及HDFS、hbase等需求。可用于管理的大小设置为6cores,内存为6G。这个值也是nodemanager中参数.cpu-vcores .resource.memory-mb的值

(2)假设一个内存大小接近于3G,也就是打算每个节点产生两个executor。--executor-memory+max(executorMemory *10%,384M)<=3G, 并且最好为512的倍数。--executor-memory其中应不超过2688M,又是512的倍数。可以取为2560M。也就是命令行中--executor-memory参数的值可以使2560。通是还有保证--executor-memory+max(executorMemory *10%,384M)的值落在必须落在nodemanager中参数minimum-allocation-mb与maximum-allocation-mb之间

(3)cpu的划分比较简单因为每个节点产生两个executor,所有每个executor中cores的个数应该小于等于6/2=3

(4) 因为已经设置driver与executor资源大小相同,所有总的(driver+executor)=3*2=6,其中driver站一个资源,所以executor个数为5个,即命令行中--num-executors值为5

综上:参数值num-executors=5、executor-memory=2560m、executor-cores=3.

转载于:https://my.oschina.net/u/3825598/blog/1801079

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值