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
吗?
答案 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
}
这就是我以前计算应用程序内存的方式 - 虽然不是特别严格:
例如,如果spark.executor.memory = 4g
4 x 0.6 x 0.9 = 2.16g