java - yarn 容器内存不足

标签 java hadoop apache-spark cloudera hadoop-yarn

我的 yarn 容器内存不足: 这个特定的容器运行一个 Apache-Spark 驱动程序节点。

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

另一个奇怪的事情是,java 没有抛出 OutOfMemory 异常。当我查看驱动程序日志时,我发现它最终从 yarn 获取了一个 SIGTERM,并正常关闭。如果 Yarn 中的 java 进程超过 512MB,我不应该在 Java 尝试从 yarn 分配 1GB 之前得到一个 OutOfMemory 异常吗?

我还尝试使用 1024m 堆运行。那一次,容器崩溃了 1.5GB。这一直发生。很明显,容器有能力在 1GB 限制之外再分配 0.5GB。 (很符合逻辑,因为物理机有 30GB 的空闲内存)

除了 java 之外,YARN 容器内是否还有其他东西可能占用额外的 512MB?

我在 Yarn 上使用 Apache spark 运行 CDH 5.4.1。集群上的java版本也升级到了oracle Java8。看到有人说java8默认的maxPermSize改了,居然能占到512MB,我简直不敢相信。。。

yarn 错误信息:

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 

最佳答案

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

一些可能有用的选项:

  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,您也很可能会遇到它。

关于java - yarn 容器内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34954637/

相关文章:

Java 交互不允许扫描用户输入

java - 使用 Spring JdbcTemplate 提取一行中的两个字段

java - 将 20GB CSV 文件导入 Hadoop 的最佳方法

python - Hadoop/Spark 读取许多 CSV 文件

java - java Mock 文件的建议(模拟 java.io.File)

java - 如何对 LinkedList<String> 进行排序?

java - Hadoop:从 JAVA 测量洗牌时间

java - 将文件从服务器上传到另一台服务器的 Hdfs

python - PIG UDF (Python) 字符集编码

python - Spark DataFrameWriter 使用 TIMESTAMP 而不是 DATETIME