我的群集配置如下: - 7个节点,每个节点有32个内核和252 GB内存。
纱线配置如下: -
yarn.scheduler.maximum-allocation-mb - 10GB
yarn.scheduler.minimum-allocation-mb - 2GB
yarn.nodemanager.vmem-pmem-ratio - 2.1
yarn.nodemanager.resource.memory-mb - 22GB
yarn.scheduler.maximum-allocation-vcores - 25
yarn.scheduler.minimum-allocation-vcores - 1
yarn.nodemanager.resource.cpu-vcores - 25
地图缩小配置如下: -
mapreduce.map.java.opts - -Xmx1638m
mapreduce.map.memory.mb - 2GB
mapreduce.reduce.java.opts - -Xmx3276m
mapreduce.reduce.memory.mb - 4Gb
火花配置如下: -
spark.yarn.driver.memoryOverhead 384
spark.yarn.executor.memoryOverhead 384
现在我尝试通过将值设置为主纱线以及执行程序内存,num-executors,executor-cores的不同值来运行spark-shell。
在这种情况下,执行程序内存+ 384对于纱线调度程序最大不能超过10GB。所以在这种情况下9856M + 384 MB = 10GB所以它工作正常。现在一旦火花壳启动,执行器总数为124而不是需要175.火花壳启动日志中的存储内存或每个执行器的Spark UI为6.7 GB(即10GB的67%)。
spark shell进程的top命令输出如下: -
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
8478 hdp66-ss 20 0 13.5g 1.1g 25m S 1.9 0.4 2:11.28
因此虚拟内存为13.5G,物理内存为1.1g
在这种情况下,执行程序内存+ 384对于纱线调度程序最大不能超过10GB。所以在这种情况下9856M + 384 MB = 10GB所以它工作正常。现在一旦火花壳启动,执行器的总数就是35.火花壳启动日志中的存储内存或每个执行器的Spark UI是6.7 GB(即10GB的67%)。
spark shell进程的top命令输出如下: -
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
5256 hdp66-ss 20 0 13.2g 1.1g 25m S 2.6 0.4 1:25.25
因此虚拟内存为13.2G,物理内存为1.1g
在这种情况下,执行程序内存+ 384对于纱线调度程序最大不能超过10GB。所以在这种情况下4096M + 384 MB = 4GB所以它工作正常。现在一旦火花壳启动,执行器的总数就是200.火花壳启动日志中的存储内存或每个执行器的Spark UI是2.7 GB(即4GB的67%)。
spark shell进程的top命令输出如下: -
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
21518 hdp66-ss 20 0 19.2g 1.4g 25m S 3.9 0.6 2:24.46
因此虚拟内存为19.2G,物理内存为1.4g。
有人可以解释一下这些记忆和执行者是如何开始的。为什么在spark UI上看到的内存占执行者内存的67%?以及如何为每个执行者决定虚拟和物理内存。
答案 0 :(得分:2)
Spark几乎总是分配用户为执行程序请求的内存的65%到70%。 Spark的这种行为是由于SPARK JIRA TICKET " SPARK-12579" 。
if (conf.contains("spark.executor.memory")) {
val executorMemory = conf.getSizeAsBytes("spark.executor.memory")
if (executorMemory < minSystemMemory) {
throw new IllegalArgumentException(s"Executor memory $executorMemory must be at least " +
s"$minSystemMemory. Please increase executor memory using the " +
s"--executor-memory option or spark.executor.memory in Spark configuration.")
}
}
val usableMemory = systemMemory - reservedMemory
val memoryFraction = conf.getDouble("spark.memory.fraction", 0.6)
(usableMemory * memoryFraction).toLong
}
上述代码对您看到的行为负责。对于群集可能没有用户请求的内存的情况,这是一种安全防范。