Spark容器超出物理限制运行

4

我一直在寻找以下问题的解决方案。我使用的是Scala 2.11.8和Spark 2.1.0

Application application_1489191400413_3294 failed 1 times due to AM Container for appattempt_1489191400413_3294_000001 exited with exitCode: -104
For more detailed output, check application tracking page:http://ip-172-31-17-35.us-west-2.compute.internal:8088/cluster/app/application_1489191400413_3294Then, click on links to logs of each attempt.
Diagnostics: Container [pid=23372,containerID=container_1489191400413_3294_01_000001] is running beyond physical memory limits. 
Current usage: 1.4 GB of 1.4 GB physical memory used; 3.5 GB of 6.9 GB virtual memory used. Killing container.

请注意,我分配的内存比这里报告的“1.4 GB”要多得多。由于我没有看到我的执行程序失败,所以我从这个错误中读取的信息是驱动程序需要更多内存。然而,我的设置似乎没有传播。
我将作业参数设置为yarn,如下所示:
val conf = new SparkConf()
  .setAppName(jobName)
  .set("spark.hadoop.mapred.output.committer.class", "com.company.path.DirectOutputCommitter")
additionalSparkConfSettings.foreach { case (key, value) => conf.set(key, value) }

// this is the implicit that we pass around
implicit val sparkSession = SparkSession
  .builder()
  .appName(jobName)
  .config(conf)
  .getOrCreate()

additionalSparkConfSettings中设置内存分配参数的代码如下:

HashMap[String, String](
  "spark.driver.memory" -> "8g",
  "spark.executor.memory" -> "8g",
  "spark.executor.cores" -> "5",
  "spark.driver.cores" -> "2",
  "spark.yarn.maxAppAttempts" -> "1",
  "spark.yarn.driver.memoryOverhead" -> "8192",
  "spark.yarn.executor.memoryOverhead" -> "2048"
)

我的设置真的没有传播吗?还是我误解了日志?

谢谢!


我将 spark.yarn.driver.memoryOverhead 更改为 10240,但作业仍然以我上面提到的完全相同的错误失败。但是,当我将 spark.driver.memory 增加了几个 GB 时,它成功了。看起来 memoryOverhead 配置根本不起作用。 - Navneet
这个问题解决了吗? - ilcord
2个回答

0

必须为执行程序和驱动程序设置开销内存,并且它应该是驱动程序和执行程序内存的一部分。

spark.yarn.executor.memoryOverhead = executorMemory * 0.10, with minimum of 384 

每个执行器要分配的堆外内存量(以兆字节为单位)。这是一种考虑到VM开销、字符串池、其他本机开销等因素的内存。这往往随着执行器的大小而增长(通常为6-10%)。
spark.yarn.driver.memoryOverhead = driverMemory * 0.10, with minimum of 384.

在集群模式下,每个驱动程序要分配的堆外内存量(以兆字节为单位)。这是一种考虑到VM开销、国际化字符串、其他本机开销等因素的内存。这往往随着容器大小的增加而增长(通常为6-10%)。
要了解更多关于内存优化的信息,请参见内存管理概述
此外,请参见以下SO线程容器超出内存限制
干杯!

0
在我的情况下,问题是一个简单但很容易被忽视的问题。
在代码中设置驱动程序级别的参数不起作用。因为到那时,很明显已经太晚了,配置会被忽略。几个月前我解决这个问题时进行了一些测试,确认了这一点。
然而,执行器参数可以在代码中设置。但是,如果您最终在不同的位置设置相同的参数,请牢记参数优先协议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接