Memory Spark Worker请求大量虚拟内存

Memory Spark Worker请求大量虚拟内存,memory,memory-management,apache-spark,pyspark,virtual-memory,Memory,Memory Management,Apache Spark,Pyspark,Virtual Memory,我正在一个2节点的纱线集群上运行spark作业。我的数据集不太大(/mnt/warn/logs/application_1455246675722_0023/container_1455246675722_0023_0023/stdout 2>/mnt/纱线/原木/应用_1455246675722_0023/集装箱_1455246675722_0023_01_000003/stderr |-23341 23292 23292 23206(python)87 8 39464374272 23281

我正在一个2节点的纱线集群上运行spark作业。我的数据集不太大(<100MB),只是为了测试,工作进程正在被杀死,因为它需要太多的虚拟内存。这里的金额是荒谬的。使用11GB物理内存中的2GB,使用300GB虚拟内存

16/02/12 05:49:43 WARN scheduler.TaskSetManager:阶段2.1中的任务0.0丢失(TID 22,ip-172-31-6-141.ec2.internal):执行器丢失失败(执行器2因一个正在运行的任务而退出)原因:标记为失败的容器:主机上的容器:ip-172-31-6-141.ec2.internal。退出状态:143。诊断:容器[pid=23206,containerID=Container_1455246675722_0023_01_000003]运行超出虚拟内存限制。当前使用情况:使用了2.1 GB的11 GB物理内存;使用了305.3 GB的23.1 GB虚拟内存。杀人容器。 容器_1455246675722_0023_01_000003的工艺树转储: |-PID PPID PGRPID sessiond CMD_NAME USER_MODE_TIME(毫秒)SYSTEM_TIME(毫秒)VMEM_USAGE(字节)RSSMEM_USAGE(页面)FULL_CMD_行 |-23292 23213 23292 23206(python)15 3 101298176 5514 python-m pyspark.daemon |-23206 1659 23206 23206(bash)0 0 11431936 352/bin/bash-c/usr/lib/jvm/java-7-openjdk-amd64/bin/java-server-XX:onAutofmemoryError='kill%p'-xms1024m-xmx1024m-Djava.io.tmpdir=/tmp/hadoop root/nm local dir/usercache/root/appcache/application_1455246675722_0023/tmp'-Dspark.driver.port=37386'-Dspark.warn.app.container.log.dir=/mnt/warn/logs/application_1455246675722_0023/container_1455246675722_0023_01_000003-XX:MaxPermSize=256m org.apache.spark.executor.roughGrainedExecutorBackend——驱动程序urlspark://CoarseGrainedScheduler@172.31.0.92:37386--执行器id 2--主机名ip-172-31-6-141.ec2.internal--核心8--应用程序idapplication_1455246675722_0023——用户类路径文件:/tmp/hadoop root/nm local dir/usercache/root/appcache/application_1455246675722_0023/container_1455246675722_0023_01_000003/appjar 1>/mnt/warn/logs/application_1455246675722_0023/container_1455246675722_0023_0023/stdout 2>/mnt/纱线/原木/应用_1455246675722_0023/集装箱_1455246675722_0023_01_000003/stderr |-23341 23292 23292 23206(python)87 8 39464374272 23281 python-m pyspark.daemon |-23350 23292 23292 23206(python)86 7 39463976960 24680 python-m pyspark.daemon |-23329232922329223206(python)90639454172823281 python-m pyspark.daemon |-23213 23206 23206 23206(爪哇)1168 61 11967115264 359820/usr/lib/jvm/java-7-openjdk-amd64/bin/java-server-XX:onAutofmemoryError=kill%p-xms1024m-xmx1024m-Djava.io.tmpdir=/tmp/hadoop root/nm local dir/usercache/root/appcache/application_1455246675722\u 0023/container1455246675722\u 0023\u 0023\u-Dspark.driver.port=37386-Dspark.warn.app.container.log.dir=/mnt/warn/logs/application_1455246675722_0023/container_1455246675722_0023_01_000003-XX:MaxPermSize=256m org.apache.spark.executor.roughGrainedExecutorBackend——驱动程序urlspark://CoarseGrainedScheduler@172.31.0.92:37386--执行器id 2--主机名ip-172-31-6-141.ec2.internal--核心8--应用程序idapplication_1455246675722_0023——用户类路径文件:/tmp/hadoop root/nm local dir/usercache/root/appcache/application_1455246675722_0023/container_1455246675722_0023_01_000003/app.jar |-23347 23292 23292 23206(python)87 10 39464783872 23393 python-m pyspark.daemon |-23335 23292 23292 23206(python)83 9 39464112128 23216 python-m pyspark.daemon |-23338 23292 23292 23206(python)81 9 39463714816 24614 python-m pyspark.daemon |-23332 23292 23292 23206(python)86 6 39464374272 24812 python-m pyspark.daemon |-23344 23292 23292 23206(python)85 30 39464374272 23281 python-m pyspark.daemon 集装箱在要求时被杀死。出口代码是143


有人知道为什么会这样吗?我一直在尝试修改各种纱线和火花配置,但我知道它要求如此多的vmem是严重错误的。

我运行的命令是

spark-submit --executor-cores 8 ...
事实证明executor cores标志并不像我想象的那样。它创建pyspark.daemon进程的8个副本,运行工作进程的8个副本以运行作业。每个进程都使用38GB的虚拟内存,这是不必要的大,但是8*38~300,这就解释了这一点


它实际上是一个名字很差的旗子。如果我将executor cores设置为1,则会生成一个守护进程,但守护进程将使用多个核心,如htop所示。

请提供有关用于提交作业的命令的详细信息和环境详细信息。从错误中可以看出您正在提交一些python作业,请参见错误中的-Xms10240m-
101298176 5514 python-m pyspark.daemon |-23206 1659 23206 23206(bash)0 0 11431936 352/bin/bash-c/usr/lib/jvm/java-7-openjdk-amd64/bin/java-server-XX:onAutofmemoryError='kill%p'-Xms10240m-Xmx10240m-Djava.io.tmpdir=/tmp/hadoop root/nm local dir/usercache/root/appcache/application_1455246675722_0023/container14552466757220023\u 01\u000003/tmp>,它应该命名为“每个执行器的守护进程数”。我想避免执行器失败,所以您建议每个执行器使用1个守护进程还是多个守护进程?(我的物理服务器每台服务器有24个核心)我认为这在很大程度上取决于您正在尝试做什么。问题是您想在执行器层还是守护进程层进行多路复用。我认为如果你有一台机器,它应该不会有太大的区别,所以我会做每个执行器的守护进程和num executors==每个执行器使用24个/num内核。我不确定这会不会影响你的执行失败率,尽管。。。