纱线容器内存不足

时间:2016-01-22 19:41:19

标签: java hadoop apache-spark cloudera yarn

我的纱线容器内存不足: 此特定容器运行Apache-Spark驱动程序节点。

我不明白的部分:我将驱动程序的堆大小限制为512MB(您可以在下面的错误消息中看到这一点)。但纱线容器抱怨内存> 1GB(另见下面的消息)。您可以验证纱线是否正在使用Xmx512m运行java。我的容器设置为1GB内存,增量为.5GB。我的物理机器托管纱线容器每个32GB。我通过SSH连接到其中一台物理机器,看到它有很多免费内存......

另一个奇怪的事情是,java不会抛出OutOfMemory异常。当我查看驱动程序日志时,我发现它最终会从纱线中获得一个SIGTERM,然后很好地关闭。如果Yarn中的java进程超过512MB,那么在尝试从yarn分配1GB之前,我是否应该在Java中获得OutOfMemory异常?

我也试过用1024m堆运行。那个时候,容器因使用1.5GB而崩溃。这种情况一直发生。很明显,容器有能力再分配超过1GB限制的0.5GB。 (非常逻辑,因为物理机器有30GB的可用内存)

在Java旁边的YARN容器中是否还有其他东西可以占用额外的512MB?

我在Yarn上使用Apache spark运行CDH 5.4.1。集群上的Java版本也升级到oracle Java8。我看到有些人声称java8中的默认maxPermSize已被更改,但我几乎不相信它会占用512MB ......

纱线错误消息:

Diagnostics: Container [pid=23335,containerID=container_1453125563779_0160_02_000001] is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.
Dump of the process-tree for container_1453125563779_0160_02_000001 :
    |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
    |- 23335 23333 23335 23335 (bash) 1 0 11767808 432 /bin/bash -c LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native::/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native /usr/lib/jvm/java-8-oracle/bin/java -server -Xmx512m -Djava.io.tmpdir=/var/yarn/nm/usercache/hdfs/appcache/application_1453125563779_0160/container_1453125563779_0160_02_000001/tmp '-Dspark.eventLog.enabled=true' '-Dspark.executor.memory=512m' '-Dspark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar' '-Dspark.yarn.am.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native' '-Dspark.executor.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native' '-Dspark.shuffle.service.enabled=true' '-Dspark.yarn.jar=local:/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/spark/assembly/lib/spark-assembly-1.3.0-cdh5.4.1-hadoop2.6.0-cdh5.4.1.jar' '-Dspark.app.name=not_telling-1453479057517' '-Dspark.shuffle.service.port=7337' '-Dspark.driver.extraClassPath=/etc/hbase/conf:/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar' '-Dspark.serializer=org.apache.spark.serializer.KryoSerializer' '-Dspark.yarn.historyServer.address=http://XXXX-cdh-dev-cdh-node2:18088' '-Dspark.driver.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native' '-Dspark.eventLog.dir=hdfs://XXXX-cdh-dev-cdh-node1:8020/user/spark/applicationHistory' '-Dspark.master=yarn-cluster' -Dspark.yarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class 'not_telling' --jar file:/home/cloud-user/temp/not_telling.jar --arg '--conf' --arg 'spark.executor.extraClasspath=/opt/cloudera/parcels/CDH/jars/htrace-core-3.0.4.jar' --executor-memory 512m --executor-cores 4 --num-executors  10 1> /var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001/stdout 2> /var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001/stderr 
    |- 23338 23335 23335 23335 (java) 95290 10928 2786668544 261830 /usr/lib/jvm/java-8-oracle/bin/java -server -Xmx512m -Djava.io.tmpdir=/var/yarn/nm/usercache/hdfs/appcache/application_1453125563779_0160/container_1453125563779_0160_02_000001/tmp -Dspark.eventLog.enabled=true -Dspark.executor.memory=512m -Dspark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar -Dspark.yarn.am.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native -Dspark.executor.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native -Dspark.shuffle.service.enabled=true -Dspark.yarn.jar=local:/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/spark/assembly/lib/spark-assembly-1.3.0-cdh5.4.1-hadoop2.6.0-cdh5.4.1.jar -Dspark.app.name=not_tellin-1453479057517 -Dspark.shuffle.service.port=7337 -Dspark.driver.extraClassPath=/etc/hbase/conf:/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar -Dspark.serializer=org.apache.spark.serializer.KryoSerializer -Dspark.yarn.historyServer.address=http://XXXX-cdh-dev-cdh-node2:18088 -Dspark.driver.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native -Dspark.eventLog.dir=hdfs://XXXX-cdh-dev-cdh-node1:8020/user/spark/applicationHistory -Dspark.master=yarn-cluster -Dspark.yarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class not_telling --jar file:not_telling.jar --arg --conf --arg spark.executor.extraClasspath=/opt/cloudera/parcels/CDH/jars/htrace-core-3.0.4.jar --executor-memory 512m --executor-cores 4 --num-executors 10 

4 个答案:

答案 0 :(得分:3)

您的应用程序因虚拟内存使用而被杀死(注意,2.1GB使用消息中的2.6)。

一些可能有用的选项:

  1. 通过将“yarn.nodemanager.vmem-check-enabled”更改为false来禁用yarn-site.xml中的虚拟内存检查。这是经常做的,这通常是我说实话。
  2. 增加“spark.yarn.executor.memoryOverhead”和“spark.yarn.driver.memoryOverhead”直到你的工作停止被杀。
  3. 这样做的原因是因为YARN限制了允许进程使用的关闭堆内存量。如果您的应用程序有大量可执行代码(java 7或更早版本中的大型perm gen),您将很快达到此限制。如果你使用经常使用堆外内存的pyspark,你也很可能会遇到它。

答案 1 :(得分:2)

查看this article,它有很好的描述。您可能需要注意他们在说“在计算执行程序的内存时,请注意最大(7%,384m)开销堆外内存。”

编辑(由Eshalev撰写):我接受了这个答案,并详细说明了发现了什么。 Java8使用不同的内存方案。具体来说,CompressedClasses在“Metaspace”中保留了1024MB。这比以前版本的java在“perm-gen”内存中分配的要大得多。您可以使用“jmap -heap [pid]”来检查这一点。我们目前通过超出我们的堆要求超过1024MB来防止应用程序崩溃。这很浪费,但它可以防止应用程序崩溃。

答案 2 :(得分:1)

除非您处理的数据非常少,否则每个执行者只能获得1GB内存。

计算可以使用的正确资源的最佳方法是这样的: 获取 1节点上的cpu和内存的nb,为系统hdfs保留1到4个cpu内核(4核节点时为1核,如果有32个核心节点则为4核) 除以2到5(至少2个具有广播数据的多任务,并且不会超过5,因为您将面临糟糕的hdfs IO带宽),您将获得一个节点上可以拥有的执行器数量。 现在获取此节点的ram数量,看看最大的taht yarn允许您在一个节点中使用所有容器(对于您的情况应该接近26 GB)并将其除以之前计算的执行程序数。 删除10%,你得到一个遗嘱执行人的金额或记忆。

手动将spark.yarn.executor.memoryOverhead设置为执行程序内存的10%,因为HDP或CDH可能会强制它为384MB,这是最小值。

现在对于实例数量,将执行器X数量乘以节点数量并为驱动程序删除1(是的,你应该以同样的方式提高驱动程序的内存量和CPU量)

所以例如我在aws R4.8xlarge上有3个节点,每个节点有32个cpu和244GB内存,这允许我有20个执行器,每个执行器有4个cpu和26 GB内存

spark.executor.memory=26g
spark.yarn.executor.memoryOverhead=2600
spark.driver.memory=26g
spark.yarn.driver.memoryOverhead=2600
spark.executor.cores=4
spark.executor.instances=20
spark.driver.cores=4

之后,您可能需要根据您的配置进行调整,例如,您可以减少执行程序的数量,以允许它们拥有更多内存。

答案 3 :(得分:0)

有时问题是你的RDD没有被平分。您也可以尝试在每个/某些转换上增加分区(通过合并或重新分区,也可以使用partitionBy)。