【发布时间】:2015-11-24 09:01:59
【问题描述】:
我正在 YARN 上对我的 Spark 作业进行一些内存调整,我注意到不同的设置会产生不同的结果并影响 Spark 作业的运行结果。但是,我很困惑,不完全理解为什么会发生这种情况,如果有人可以为我提供一些指导和解释,我将不胜感激。
我将提供一些背景信息并发布我的问题并描述我在下面遇到的案例。
我的环境设置如下:
- 内存 20G,每个节点 20 个 VCore(共 3 个节点)
- Hadoop 2.6.0
- Spark 1.4.0
我的代码递归地过滤 RDD 以使其更小(作为算法的一部分删除示例),然后执行 mapToPair 和 collect 以收集结果并将它们保存在列表中。
问题
为什么在第一种情况和第二种情况之间会抛出不同的错误并且作业运行时间更长(对于第二种情况),而仅增加了执行程序内存?这两个错误是否以某种方式联系在一起?
第三种和第四种情况都成功了,我理解这是因为我提供了更多的内存来解决内存问题。但是,在第三种情况下,
spark.driver.memory + spark.yarn.driver.memoryOverhead = 内存 YARN 将创建一个 JVM
= 11g + (driverMemory * 0.07, 最少 384m) = 11 克 + 1.154 克 = 12.154克
所以,从公式中,我可以看到我的工作需要 MEMORY_TOTAL 大约 12.154g 才能成功运行,这解释了为什么我需要超过 10g 的驱动程序内存设置。
但是对于第四种情况,
spark.driver.memory + spark.yarn.driver.memoryOverhead = 内存 YARN 将创建一个 JVM
= 2 + (driverMemory * 0.07, 最少 384m) = 2g + 0.524g = 2.524克
似乎只需将内存开销增加少量 1024(1g) 就可以成功运行驱动程序内存仅为 2g 且 MEMORY_TOTAL 仅为 2.524g 的作业 !而没有开销配置,小于 11g 的驱动程序内存会失败,但从公式中没有意义,这就是我感到困惑的原因。
为什么增加内存开销(对于驱动程序和执行程序)可以让我的工作以较低的MEMORY_TOTAL(12.154g 与 2.524g)成功完成?我还缺少其他一些内部工作吗?
第一种情况
/bin/spark-submit --class <class name> --master yarn-cluster --driver-memory 7g --executor-memory 1g --num-executors 3 --executor-cores 1 --jars <jar file>
如果我使用任何小于 11g 的驱动程序内存运行我的程序,我将收到以下错误,即 SparkContext 正在停止或类似的错误,即在停止的 SparkContext 上调用方法。根据我收集的信息,这与内存不足有关。
第二种情况
/bin/spark-submit --class <class name> --master yarn-cluster --driver-memory 7g --executor-memory 3g --num-executors 3 --executor-cores 1 --jars <jar file>
如果我使用相同的驱动程序内存但更高的执行程序内存运行程序,则作业运行时间比第一种情况更长(大约 3-4 分钟),然后它会遇到与之前不同的错误,即容器请求/使用超过允许的内存,因此被杀死。虽然我觉得这很奇怪,因为执行器内存增加了,并且发生了这个错误而不是第一种情况下的错误。
第三种情况
/bin/spark-submit --class <class name> --master yarn-cluster --driver-memory 11g --executor-memory 1g --num-executors 3 --executor-cores 1 --jars <jar file>
驱动程序内存大于 10g 的任何设置都将导致作业能够成功运行。
第四种情况
/bin/spark-submit --class <class name> --master yarn-cluster --driver-memory 2g --executor-memory 1g --conf spark.yarn.executor.memoryOverhead=1024 --conf spark.yarn.driver.memoryOverhead=1024 --num-executors 3 --executor-cores 1 --jars <jar file>
使用此设置,作业将成功运行(驱动程序内存 2g 和执行程序内存 1g,但会增加驱动程序内存开销(1g)和执行程序内存开销(1g)。
任何帮助都将不胜感激,并且对我对 Spark 的理解很有帮助。提前致谢。
【问题讨论】:
标签: hadoop memory memory-management apache-spark out-of-memory