spark提交内存分配机制

参考资料 https://zhuanlan.zhihu.com/p/137471443

前言

众所周知,我们一直在用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,命令如下

/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

image.png

然后发现占用了7个G 的内存,如上图所示,它的内存是怎么占用的呢?
分析如下
1、executor 占用的内存为 heap 内存和 off-heap内存。 heap内存由 --executor-memory指定为5g,off-heap内存由spark.executor.memoryOverhead 配置为默认值。就是50.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提交

/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

image.png

然后发现占用了9G的内存,如上图所示。分析如下
1、executor 占用的内存为 heap 内存和 off-heap内存。 heap内存由 --executor-memory指定为5g,off-heap内存由spark.executor.memoryOverhead 配置为默认值。就是50.1
那这样executor所占用的内存就为5
1.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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值