讓十年大牛帶你進行spark on yarn 內存分配詳解,其實真不難!

讓十年大牛帶你進行spark on yarn 內存分配詳解,其實真不難!

1. 基礎概念

要掌握這個知識點,要了解以下幾個點:

  1. spark driver和executor的on-heap內存是如何配置的。
  2. spark driver和excutor的off-heap內存是如何配置的。
  3. 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有個最小粒度,資源調度的時候必須是其整數倍,最小粒度的配置參數是

<code>yarn.scheduler.minimum-allocation-mb/<code>

最小調度單元默認值是1024,單位是mb。

2.cluster模式

浪尖這裡的案例是40個executor,單個executor內存申請的時候是20GB,driver是20GB,yarn的web ui截圖如下:

讓十年大牛帶你進行spark on yarn 內存分配詳解,其實真不難!

整個APP申請的總內存是 923648MB=902GB。

spark app申請的單個 Executor內存,從1.3和1.4可以得知是:

那麼40個executor內存是:


<code>22GB * 40 = 880GB /<code>

spark on yarn 的cluster模式下Driver端與appmaster是在一起的,所以appmaster內存參數無效,因此driver和executor總內存由1.1和1.2可得:

<code>20GB * 0.1 +20GB=22G/<code>

那麼計算所得的總內存是:

<code>22GB+88 GB正好是 902GB。/<code>

上面計算的案例中,由於浪院長這裡的yarn集群內存調度的最小粒度是1GB貌似,在上面的計算中沒有參與度。

3.cluster模式下


此時假設是10個executor,每個executor的內存是19GB,driver的內存依然是19GB。

首先,我們先看一下,web ui的總內存:

讓十年大牛帶你進行spark on yarn 內存分配詳解,其實真不難!

換算成GB就是236544MB/1024 = 231GB

那麼經計算可以指導單個executor的內存是:

19*1.1GB =20.9GB

Yarn的最小調度單元是1GB,所以單個executor調度的時候內存是21GB。

10個executor的總內存就是 21 *10 = 210GB

經計算可以得到driver的內存是19*1.1GB= 21GB

那麼計算所得的spark app內存和 yarn ui上所得內存一致。

4.注意點

上述計算要想正確要確保:

沒有開啟動態executor申請與釋放,假設開啟了,要視情況計算。

讓十年大牛帶你進行spark on yarn 內存分配詳解,其實真不難!


分享到:


相關文章: