实际执行程序内存与我设置的执行程序内存不匹配

时间:2017-04-12 02:25:28

标签: apache-spark

我有一个带有1个Master(slaver1)和2个worker(slaver2,slaver3)的spark2.0.1集群,每台机器都有2GB RAM。当我运行命令时 def consecutiveLetter(mystr): for x in range(len(mystr)-2) : if ord(mystr[x])+1 == ord(mystr[x+1]) and ord(mystr[x+1])+1 == ord(mystr[x+2]) : print("String has 3 consecutive letters") return print("String has no 3 consecutive letters") 当我检查web中的执行程序内存时(slaver1:4040 / executors /)。我发现它是110MB。 image description here

2 个答案:

答案 0 :(得分:2)

您正在谈论的内存是存储内存实际上Spark将内存[被叫Spark Memory]分为2区域优先Storage Memory,其次是Execution Memory

总记忆可以通过此公式计算 (“Java Heap” – “Reserved Memory”) * spark.memory.fraction

只是为了概述存储内存是这个池用于存储Apache Spark缓存数据和临时空间序列化数据“unroll”。此外,所有“广播”变量都作为缓存块存储在那里

如果要查看提供的总内存,可以在开始时转到Spark UI Spark-Master-Ip:8080 [默认端口],您可以找到名为MEMORY的部分,即spark使用的总内存。

由于

答案 1 :(得分:0)

从Spark 1.6版本开始,根据以下图片划分内存 enter image description here

执行和存储内存之间没有硬边界。存储内存比执行内存需要更多,反之亦然。该 执行和存储内存由(ExecutorMemory-300Mb)* spark.memory.fraction

提供

在你的情况下(500-300)*)。75 = 150mb,在分配的Executor内存中会有3到5%的错误。

300Mb是保留内存

用户记忆=(ExecutorMemory-300)*)。(1-spark.memory.fraction)。

在您的情况下(500-300)*)。25 = 50mb

Java Memory : Runtime.getRuntime().maxMemory()