前言
众所周知,我们一直在用spark-submit 来提交任务,在yarn 见面的Allocated Memory可以看到yarn总共的占用内存。以及启动的Containers。那具体的内存占用情况却没有显示那么清楚,今天来具体分析一下这一块。
1、基本概念
1、spark相关
1、spark.driver.memory
默认值1g。driver进程的on-heap内存,driver进程就是sparkcontext初始化所在的进程。在client模式下driver的堆内存,不要通过SparkConf设置,要用--driver-memory命令替换,或者在默认的配置文件里配置。
2、spark.driver.memoryOverhead
默认值是max(DriverMemory*0.1,384m)。在YARN或者kubernetes模式的cluster模式下,driver端申请的off-heap内存的总量,通常是driver堆内存的6%-10%。
3、spark.executor.memory
默认值1g。Executor的jvm内存总量。
4、spark.executor.memoryOverhead
默认值max(executor*0.1,384).单个executor申请的off-heap内存的总量。该参数仅仅支持在yarn或者kubernetes上使用,通常可以是executor内存的0.06-0.1。
5、spark.yarn.am.memory
默认值512m,Appmaster在client模式下的内存。假如是Cluster模式下会使用spark.driver.memory来代替。
2、Yarn的最小调度单元
yarn调度container有个最小粒度,资源调度的时候必须是其整数倍,最小粒度的配置参数是
yarn.scheduler.minimum-allocation-mb
最小调度单元默认值是1024,单位是mb。意思是container的大小必须为1024mb的倍数。即必须是1G的整数倍。
2、具体测试
1、client 模式
我简单写了个样例去读取一张表,然后计算count(*) 的值,并将其show出来。然后打包,使用spark-submit 提交jar,命令如下
image.png/opt/beh/core/spark/bin/spark-submit --master yarn --deploy-mode client --driver-memory 2g --num-executors 1 --executor-cores 1 --executor-memory 5g --class com.example.sparklearn.Test /home/hadoop/zgh/sparklearn-0.0.1-SNAPSHOT.jar
然后发现占用了7个G 的内存,如上图所示,它的内存是怎么占用的呢?
分析如下
1、executor 占用的内存为 heap 内存和 off-heap内存。 heap内存由 --executor-memory指定为5g,off-heap内存由spark.executor.memoryOverhead 配置为默认值。就是5乘以0.1
那这样executor所占用的内存就为5乘以1.1 为5.5G 。根据yarn的最小调度单元规定,必须为1g的整数倍,所以为6G。
2、applicationMaster在client模式中起到调度的作用。由spark.yarn.am.memory配置为默认值512mb。根据yarn的最小调度单元规定,必须为1g的整数倍,所以为1G。
所以总计占用7G内存
注意
这里可能有人会问,driver端不占用内存么? 因为client模式下driver端在本机的客户端,它相当于起了一个进程,没有在yarn的container上面运行,所以不占用yarn的资源。
2、cluster模式
然后spark-submit提交
image.png/opt/beh/core/spark/bin/spark-submit --master yarn --deploy-mode cluster --driver-memory 2g --num-executors 1 --executor-cores 1 --executor-memory 5g --class com.example.sparklearn.Test /home/hadoop/zgh/sparklearn-0.0.1-SNAPSHOT.jar
然后发现占用了9G的内存,如上图所示。分析如下
1、executor 占用的内存为 heap 内存和 off-heap内存。 heap内存由 --executor-memory指定为5g,off-heap内存由spark.executor.memoryOverhead 配置为默认值。就是50.1
那这样executor所占用的内存就为51.1 为5.5G 。根据yarn的最小调度单元规定,必须为1g的整数倍,所以为6G。
2、因为在cluster中driver和applicationMaster在一个container,这里applicationMaster内存参数无效,driver端的heap内存由--driver-memory指定为2G,off-heap内存由spark.driver.memoryOverhead配置为默认值DriverMemory*0.1,这里为0.2。 所以所在的container占用的内存就为3G。
所以总计的内存为9G
网友评论