【问题标题】:Spark Container running beyond physical limitsSpark Container 运行超出物理限制
【发布时间】:2017-08-20 16:59:26
【问题描述】:

我一直在寻找解决以下问题的方法。我正在使用 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 中的内存配置参数使用以下 sn-p 设置:

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 配置似乎真的不起作用。
  • 这个问题解决了吗?

标签: scala apache-spark hadoop hadoop-yarn


【解决方案1】:

需要为执行程序和驱动程序设置开销内存,它应该是驱动程序和执行程序内存的一小部分。

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 上的以下线程

干杯!

【讨论】:

    【解决方案2】:

    在我的案例中,问题很简单,虽然很容易错过。

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

    但是可以在代码中设置执行器参数。但是,如果您最终在不同的地方设置相同的参数,请记住参数优先协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 2018-03-30
      • 1970-01-01
      • 2022-12-15
      • 2012-12-16
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多