如何判断执行程序中的可用内存量

时间:2015-03-11 12:12:13

标签: apache-spark

Spark执行程序使用一些内存来缓存(spark.storage.memoryFraction)和一些内存用于shuffle(spark.shuffle.memoryFraction)。其余的可供应用程序代码使用,例如在RDD.map操作中运行。

我想知道这个可用内存的数量。 (我希望有大的分区仍然适合内存。我想将数据大小除以每个分区的可用内存以获得分区数。)

以下是我如何计算:

val numExecutors = sc.getExecutorStorageStatus.size - 1 // Exclude driver.
val totalCores = numExecutors * numCoresPerExecutor
val cacheMemory = sc.getExecutorMemoryStatus.values.map(_._1).sum
val conf = sc.getConf
val cacheFraction = conf.getDouble("spark.storage.memoryFraction", 0.6)
val shuffleFraction = conf.getDouble("spark.shuffle.memoryFraction", 0.2)
val workFraction = 1.0 - cacheFraction - shuffleFraction
val workMemory = workFraction * cacheMemory / cacheFraction
val workMemoryPerCore = workMemory / totalCores

我相信你会同意这很糟糕。最糟糕的是,如果Spark中的默认值发生变化,我的结果将是不正确的。但默认值在Spark中是硬编码的。我没办法搞定他们。

有更好的方法来获取workMemoryPerCore吗?

1 个答案:

答案 0 :(得分:0)

根据我的理解,应用程序可用的最大内存(使用默认值)确定如下:

  private def getMaxMemory(conf: SparkConf): Long = {
    val memoryFraction = conf.getDouble("spark.storage.memoryFraction", 0.6)
    val safetyFraction = conf.getDouble("spark.storage.safetyFraction", 0.9)
    (Runtime.getRuntime.maxMemory * memoryFraction * safetyFraction).toLong
  }

https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/storage/BlockManager.scala#L1227

这就是我以前计算应用程序内存的方式 - 虽然不是特别严格:

例如,如果spark.executor.memory = 4g

4 x 0.6 x 0.9 = 2.16g