Web UI如何计算存储内存(在Executors选项卡中)?

Kho*_*zzy 4 apache-spark pyspark

我试图了解Spark 2.1.0如何在节点上分配内存.

假设我正在启动一个本地PySpark REPL,为它分配2GB的内存:

$ pyspark --conf spark.driver.memory=2g
Run Code Online (Sandbox Code Playgroud)

Spark UI告诉我们为存储内存分配了956.6 MB:

在此输入图像描述

我不明白如何达到这个数字,这是我的思考过程:

  1. 驱动程序堆大小设置为2048 MB,
  2. 根据文档:(2048 MB - 300 MB) * 0.6 = 1048.8 MB用于执行和存储区域(统一),
  3. 另外,1048.8 MB * 0.5 = 524.4 MB在统一区域内应保留为免疫存储区域

那么,Spark中956.6 MB的值是如何实际计算的呢?

Jac*_*ski 16

您似乎正在使用local模式(一个驱动程序也充当唯一的执行程序),但它也应该适用于其他集群模式.

启用INFO日志记录级别BlockManagerMasterEndpoint以了解Spark看到您在命令行上设置的属性(as spark.driver.memory)的内存量.

log4j.logger.org.apache.spark.storage.BlockManagerMasterEndpoint=INFO
Run Code Online (Sandbox Code Playgroud)

当你开始时,spark-shell --conf spark.driver.memory=2g你会看到以下内容:

$ ./bin/spark-shell --conf spark.driver.memory=2g
...
17/05/07 15:20:50 INFO BlockManagerMasterEndpoint: Registering block manager 192.168.1.8:57177 with 912.3 MB RAM, BlockManagerId(driver, 192.168.1.8, 57177, None)
Run Code Online (Sandbox Code Playgroud)

如您所见,可用内存为912.3,其计算方法如下(请参阅UnifiedMemoryManager.getMaxMemory):

// local mode with --conf spark.driver.memory=2g
scala> sc.getConf.getSizeAsBytes("spark.driver.memory")
res0: Long = 2147483648

scala> val systemMemory = Runtime.getRuntime.maxMemory

// fixed amount of memory for non-storage, non-execution purposes
val reservedMemory = 300 * 1024 * 1024

// minimum system memory required
val minSystemMemory = (reservedMemory * 1.5).ceil.toLong

val usableMemory = systemMemory - reservedMemory

val memoryFraction = sc.getConf.getDouble("spark.memory.fraction", 0.6)
scala> val maxMemory = (usableMemory * memoryFraction).toLong
maxMemory: Long = 956615884

import org.apache.spark.network.util.JavaUtils
scala> JavaUtils.byteStringAsMb(maxMemory + "b")
res1: Long = 912
Run Code Online (Sandbox Code Playgroud)

让我们回顾一下web UI如何计算内存(这与上面的内容不同,应该只显示值!).这是令人惊讶的部分.

存储内存如何显示在网络用户界面由自定义JavaScript函数控制formatBytesutils.js那(映射到斯卡拉)如下所示:

def formatBytes(bytes: Double) = {
  val k = 1000
  val i = math.floor(math.log(bytes) / math.log(k))
  val maxMemoryWebUI = bytes / math.pow(k, i)
  f"$maxMemoryWebUI%1.1f"
}
scala> println(formatBytes(maxMemory))
956.6
Run Code Online (Sandbox Code Playgroud)

956.6!这正是Web UI显示的内容,与Spark UnifiedMemoryManager认为的可用内存完全不同.相当令人惊讶,不是吗?


我认为这是一个错误,并填写为SPARK-20691.