美文网首页
spark提交内存分配机制

spark提交内存分配机制

作者: 早点起床晒太阳 | 来源:发表于2020-05-18 17:26 被阅读0次

    参考资料 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 配置为默认值。就是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提交

    /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

    相关文章

      网友评论

          本文标题:spark提交内存分配机制

          本文链接:https://www.haomeiwen.com/subject/mtkpohtx.html