Spark容器超出物理极限

时间:2017-03-27 20:15:57

标签: scala apache-spark hadoop yarn

我一直在寻找以下问题的解决方案。我使用的是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分配的内容远远多于此处的错误。由于我没有看到任何执行器失败,我从这个错误中读到的是驱动程序需要更多内存。但是,我的设置似乎没有传播过来。

我将作业参数设置为纱线,如下所示:

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"
)

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

谢谢!

2 个答案:

答案 0 :(得分: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%)而趋于增长。

要了解有关内存优化的更多信息,请参阅Memory Management Overview

另见SO Container is running beyond memory limits

上的以下帖子

干杯!

答案 1 :(得分:0)

我的案例中的问题是一个简单但容易错过的问题。

在代码中设置驱动程序级参数在代码中不起作用。因为到那时,它显然已经太晚了,配置被忽略了。几个月前,当我解决它时,我通过一些测试证实了这一点。

然而,可以在代码中设置执行程序参数。但是,如果最终在不同的位置设置相同的参数,请记住参数优先级协议。