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

标签 apache-spark pyspark

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

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

$ pyspark --conf spark.driver.memory=2g

Spark UI 告诉有 956.6 MB 分配给存储内存:

enter image description here

我不明白如何得到那个数字,这是我的思考过程:
  • 驱动程序堆大小设置为 2048 MB ,
  • 根据 docs :(2048 MB - 300 MB) * 0.6 = 1048.8 MB用于执行和存储区域(统一),
  • 另外 1048.8 MB * 0.5 = 524.4 MB统一区域内应保留为免疫存储区域

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

    最佳答案

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

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

    log4j.logger.org.apache.spark.storage.BlockManagerMasterEndpoint=INFO
    

    当您开始时 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)
    

    如您所见,可用内存为 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
    

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

    存储内存在 Web UI 中的显示方式由自定义 JavaScript 函数控制 formatBytesutils.js那(映射到 Scala)如下所示:
    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
    

    956.6 !这正是 Web UI 显示的内容,与 Spark 的 UnifiedMemoryManager 完全不同。考虑可用内存。很令人惊讶,不是吗?

    我认为这是一个错误并将其填充为 SPARK-20691 .

    关于apache-spark - Web UI 如何计算存储内存(在 Executors 选项卡中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801062/

    相关文章:

    apache-spark - 如何创建一个空的DataFrame?为什么是 “ValueError: RDD is empty”?

    python - 使用 Spark 将列转置为行

    java - GHA 中的单元测试因 java.lang.IllegalArgumentException : Unsupported class file major version 55 失败

    pyspark - 如何在pyspark中加载databricks包dbutils

    python - Pyspark:从密集向量列中获取新列中每一行的最大预测值

    python - 检索数据框中唯一的列组合的任意行

    scala - 使用 pyspark 读取 csv 文件时获取格式错误记录的列名称

    sql-server - Spark-sqlserver连接

    apache-spark - Yarn 的 "Application Type"在哪里/如何定义?

    apache-spark - 具有显式 setMaster ("local"的 Spark 作业),通过 YARN 传递给 spark-submit