纱线容器内存不足

esh*_*lev 6 java hadoop cloudera hadoop-yarn apache-spark

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

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

另一个奇怪的事情是,java 没有抛出 OutOfMemory 异常。当我查看驱动程序日志时,我发现它最终从 yarn 获得了一个 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 
Run Code Online (Sandbox Code Playgroud)

Ham*_*ari 7

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

几个可能有帮助的选项:

  1. 通过将“yarn.nodemanager.vmem-check-enabled”更改为 false 来禁用 yarn-site.xml 中的虚拟内存检查。这很常见,老实说,这通常是我所做的。
  2. 增加“spark.yarn.executor.memoryOverhead”和“spark.yarn.driver.memoryOverhead”,直到你的工作停止被杀死。

这样做的原因是因为 YARN 限制了您的进程可以使用的堆外内存量。如果您的应用程序有大量可执行代码(java 7 或更早版本中的大型 perm gen),您将很快达到此限制。如果您使用 pyspark,其中堆外内存的使用频率很高,那么您也很可能会遇到它。


小智 3

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

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