我有一个5个工作节点集群,每个节点集群有6 GB内存(Spark执行程序内存设置为4608 GB)。
我的内存不足,Spark告诉我,我的一个执行程序试图使用更多的5.0 GB内存。如果每个执行程序获得5 GB的内存,那么我的整个集群之间应该有25 GB的内存。
ExecutorLostFailure (executor 4 exited caused by one of the running tasks)
Reason: Container killed by YARN for exceeding memory limits. 5.0 GB of 5.0
GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
在我的spark应用程序开始时,当我在Storage选项卡中查看我的一个RDD时(此时它是缓存中唯一的rdd),我看到:
RDD Name Storage Level Cached Partitions Fraction Cached Size in Memory Size on Disk
myRDD Memory Serialized 1x Replicated 20 100% 3.2 GB 0.0 B
Host On Heap Memory Usage Off Heap Memory Usage Disk Usage
Node 1 643.5 MB (1931.3 MB Remaining) 0.0 B (0.0 B Remaining) 0.0 B
Master 0.0 B (366.3 MB Remaining) 0.0 B (0.0 B Remaining) 0.0 B
Node 2 654.8 MB (1920.0 MB Remaining) 0.0 B (0.0 B Remaining) 0.0 B
Node 3 644.2 MB (1930.6 MB Remaining) 0.0 B (0.0 B Remaining) 0.0 B
Node 4 656.2 MB (1918.6 MB Remaining) 0.0 B (0.0 B Remaining) 0.0 B
Node 5 652.4 MB (1922.4 MB Remaining) 0.0 B (0.0 B Remaining) 0.0 B
这似乎表明每个节点只有大约2.5 GB的可用内存。在我的spark应用程序出现内存不足错误之前,存储选项卡也永远不会接近显示25 GB的缓存RDD。
如何确定为缓存的RDD分配了多少内存?
答案 0 :(得分:1)
提交作业时,您可以指定参数spark.memory.storageFraction
。此默认值为0.5。
因此,在为执行程序分配5G内存的情况下,2.5G将保留用于缓存,剩余的2.5G将用于执行。
spark.memory.storageFraction
对驱逐免疫的存储记忆量,表示为s park.memory.fraction预留区域大小的一部分。这个越高,执行的工作内存越少,任务可能会更频繁地溢出到磁盘。建议将此值保留为默认值。有关更多详细信息,请参阅this description。