适用模块

    计算spark任务在yarn上实际的申请资源,很多用户在运行spark任务时,只了解分配driver内存和executor内存,而对yarn上实际分配的内存的情况不了解,本文介绍如何计算。

    具体说明

    1.基础概念

    要掌握这个知识点,要了解以下几个点:

    spark driver和executor的on-heap内存是如何配置的。

    spark driver和excutor的off-heap内存是如何配置的。

    yarn的最小调度单元。

    首先,讲一下上面的这三个概念吧:

    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来代替。

    6).Yarn的最小调度单元

    yarn调度container有个最小粒度,字段调度的时候必须是其整数倍,最小粒度的配置参数是

    yarn.scheduler.minimum-allocation-mb 最小调度单元默认值是1024,单位是mb。

    2.以cluster模式为例
    INFO-spark on yarn 内存分配 - 图1
    这里的案例是40个executor,单个executor内存申请的时候是20GB,driver是20GB,yarn的web ui截图如下: 个APP申请的总内存是 923648MB=902GB。

    spark app申请的单个 Executor内存,从1.3和1.4可以得知是:

    20GB * 0.1 +20GB=22GB 那么40个executor内存是:

    22GB * 40 = 880GB spark on yarn 的cluster模式下Driver端与appmaster是在一起的,所以appmaster内存参数无效,因此driver和executor总内存由1.1和1.2可得:

    20GB * 0.1 +20GB=22G 那么计算所得的总内存是:

    22GB+88 GB正好是 902GB。 上面计算的案例中,由于浪院长这里的yarn集群内存调度的最小粒度是1GB貌似,在上面的计算中没有参与度。

    3.注释

    spark.yarn.am.memory默认值512m,Appmaster在client模式下的内存。假如是Cluster模式下会使用spark.driver.memory来代替。

    在client模式下,AM对应的Container内存由spark.yarn.am.memory加上spark.yarn.am.memoryOverhead来确定,executor加上spark.yarn.executor.memoryOverhead的值之后确定对应Container需要申请的内存大小,driver和executor的内存加上spark.yarn.driver.memoryOverhead或spark.yarn.executor.memoryOverhead的值之后再乘以0.54确定storage memory内存大小。在YARN中,Container申请的内存大小必须为yarn.scheduler.minimum-allocation-mb的整数倍。


    作者:刘思伟