1.spark on yarn 参数有默认配置
先看一下spark提交任务命令
$ ./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
spark的参数都有默认值,executor-cores默认1 ,executor-memory默认1g等等,而yarn默认可以调用的资源都是8核cpu 8G内存.
所以,提交任务都是采用默认参数提交的,结果运行时查看计算机状况使用的,没有最大限度的使用到计算机资源,于是这次提交任务就简单的了解了一下参数设置方面的问题,做个简单的记录。本文spark是提交到yarn上执行的,所有仅限于spark on yarn 运行模式。
2.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个,最好手动设置
3.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)大小
4.Spark On YARN资源使用
当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器运行。Spark可以使得多个Tasks在同一个容器里面运行。
4.1.对于集群中每个节点首先需要找出nodemanager管理的资源大小,总的资源-系统需求资源-hbase、HDFS等需求资源=nodemanager管理资源
4.2.划分内存资源,有上文中jvm资源需求等于executor.memory(JVM堆资源)+executor.memoryOverhead(JVM非堆需要资源),也就是一个executor需要的内存资源=--executor-memory+max(executorMemory *10%,384M)。同时这个值需要通过yarn申请,必须落在minimum-allocation-mb与maximum-allocation-mb之间
4.3.划分cpu资源,通过executor.cores指定executor可拥有的cpu个数,也就是task可并行运行的个数,一般小于5
4.4 计算executor个数。设置num-executors
对于client模式:nodemanager管理资源>=executor个数executor资源(内存+cpu) 对于cluster模式:nodemanager管理资源>=executor个数executor(内存+cpu)+driver资源(内存+cpu)
注:除了静态指定资源,yarn拥有更智能的资源队列管理配置,关于yarn资源队列管理介绍将在后面发文。
5.示例分析(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.