当前位置: 首页 > 面试题库 >

YARN中Spark应用程序的物理内存不断增加

周枫涟
2023-03-14
问题内容

我正在YARN中运行一个Spark应用程序,其中有两个XMS / Xmx执行器为32
GB,spark.yarn.excutor.memoryOverhead为6 GB。

我看到应用程序的物理内存不断增加,并最终被节点管理器杀死:

2015-07-25 15:07:05,354 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl: Container [pid=10508,containerID=container_1437828324746_0002_01_000003] is running beyond physical memory limits. Current usage: 38.0 GB of 38 GB physical memory used; 39.5 GB of 152 GB virtual memory used. Killing container.
Dump of the process-tree for container_1437828324746_0002_01_000003 :
    |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
    |- 10508 9563 10508 10508 (bash) 0 0 9433088 314 /bin/bash -c /usr/java/default/bin/java -server -XX:OnOutOfMemoryError='kill %p' -Xms32768m -Xmx32768m  -Dlog4j.configuration=log4j-executor.properties -XX:MetaspaceSize=512m -XX:+UseG1GC -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:gc.log -XX:AdaptiveSizePolicyOutputInterval=1  -XX:+UseGCLogFileRotation -XX:GCLogFileSize=500M -XX:NumberOfGCLogFiles=1 -XX:MaxDirectMemorySize=3500M -XX:NewRatio=3 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=36082 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:NativeMemoryTracking=detail -XX:ReservedCodeCacheSize=100M -XX:MaxMetaspaceSize=512m -XX:CompressedClassSpaceSize=256m -Djava.io.tmpdir=/data/yarn/datanode/nm-local-dir/usercache/admin/appcache/application_1437828324746_0002/container_1437828324746_0002_01_000003/tmp '-Dspark.driver.port=43354' -Dspark.yarn.app.container.log.dir=/opt/hadoop/logs/userlogs/application_1437828324746_0002/container_1437828324746_0002_01_000003 org.apache.spark.executor.CoarseGrainedExecutorBackend akka.tcp://sparkDriver@nn1:43354/user/CoarseGrainedScheduler 1 dn3 6 application_1437828324746_0002 1> /opt/hadoop/logs/userlogs/application_1437828324746_0002/container_1437828324746_0002_01_000003/stdout 2> /opt/hadoop/logs/userlogs/application_1437828324746_0002/container_1437828324746_0002_01_000003/stderr

我禁用了YARN的参数“ yarn.nodemanager.pmem-check-enabled”,并注意到物理内存使用量一直达到40 GB。

我检查了中的总RSS /proc/pid/smaps,它的值与Yarn报告并在top命令中看到的物理内存相同。

我检查了堆是否存在问题,但是堆/本机内存中的某些内容正在增加。我使用了像Visual
VM这样的工具,但没有发现那里增加的任何东西。MaxDirectMmeory也没有超过600 MB。活动线程的峰值数量为70-80,线程堆栈大小不超过100
MB。MetaspaceSize约为60-70 MB。

仅供参考,我使用的是Spark 1.2和Hadoop 2.4.0,我的Spark应用程序基于Spark
SQL,它是HDFS读/写密集型应用程序,可以将数据缓存在Spark SQL的内存缓存中。

我应该在哪里调试内存泄漏,或者那里已经有工具?


问题答案:

终于我摆脱了这个问题。问题是,在Spark
SQL的镶木地板写路径中创建的压缩器没有被回收,因此,我的执行者正在为每个镶木地板写文件创建一个全新的压缩器(从本机内存),从而耗尽了物理内存限制。

我在镶木地板Jira中打开了以下bug,并提高了PR的公关率:-

https://issues.apache.org/jira/browse/PARQUET-353

这解决了我的内存问题。

PS-您只会在Parquet写入密集型应用程序中看到此问题。



 类似资料:
  • 我是否正确理解了客户端模式的文档? 客户端模式与驱动程序在应用程序主程序中运行的集群模式相反? 在客户端模式下,驱动程序和应用程序主程序是独立的进程,因此+必须小于计算机的内存? 在客户端模式下,驱动程序内存不包括在应用程序主内存设置中吗?

  • 我曾尝试将spark程序作为单步执行Oozie工作流。我使用了jar,它通过spark submit或spark shell(相同的代码)成功执行: 应用程序不应需要大量资源—加载单个csv( 火花版本:1.6.0 Oozie版本:4.1.0 工作流是使用Hue、Oozie工作流编辑器创建的: 运行工作流后,我得到以下日志: 标准输出: 立即调用Spark类 失败的Oozie启动器,Main类[o

  • 我有一个函数,它获取一个节点的邻居,对于邻居,我使用广播变量和节点本身的id,它计算该节点的贴近度中心度。我用该函数的结果映射图的每个节点。当我打开任务管理器时,cpu根本没有被利用,就像它没有并行工作一样,内存也是一样,但是每个节点都是并行执行功能的,而且数据很大,完成起来需要时间,并不是不需要资源。非常感谢大家的帮助,谢谢。对于加载图形,我使用

  • 我一直在我的应用程序中随机(内存溢出)崩溃,所以我开始分析我的堆。我注意到,如果我从活动A到活动B,堆会从27 MB增加到35 MB(由于懒惰加载许多图像)。但是,当我完成()活动B返回到活动A时,堆大小保持不变,即使使用GC操作!! 令人讨厌的是,再次进入活动B会将堆增加到42 MB。我可以这样做,因为五月的时候,堆只会不断增加。 这是我正在使用的惰性图像加载库: LazyListhttps:/

  • 我正在使用Spark1.4进行研究,并与内存设置进行斗争。我的机器有16GB内存,所以没有问题,因为我的文件只有300MB。但是,当我试图使用函数将Spark RDD转换为panda dataframe时,我收到以下错误: 我试图修复这个问题,更改了spark-config文件,但仍然得到相同的错误。我听说这是Spark1.4的一个问题,不知道您是否知道如何解决这个问题。任何帮助都是非常感谢的。

  • 问题是,那些块是什么?哪个子系统分配这些? 更新:我们不使用JIT和/或JNI本机代码调用。