Spark工作者要求荒谬的虚拟内存量

时间:2016-02-12 06:00:27

标签: memory memory-management apache-spark pyspark virtual-memory

我正在2节点纱线集群上运行火花作业。我的数据集不是很大(<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):ExecutorLostFailure(执行者2退出由其中一个正在运行的任务)原因:容器标记为失败:容器上的容器_1455246675722_0023_01_000003: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虚拟内存。杀死容器。   container_1455246675722_0023_01_000003的进程树转储:       | - PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS)SYSTEM_TIME(MILLIS)VMEM_USAGE(BYTES)RSSMEM_USAGE(PAGES)FULL_CMD_LINE       | - 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:OnOutOfMemoryError =&#39; kill% p&#39; -Xms10240m -Xmx10240m -Djava.io.tmpdir = / tmp / hadoop-root / nm-local-dir / usercache / root / appcache / application_1455246675722_0023 / container_1455246675722_0023_01_000003 / tmp&#39; -Dspark.driver.port = 37386&#39; -Dspark.yarn.app.container.log.dir = / mnt / yarn / logs / application_1455246675722_0023 / container_1455246675722_0023_01_000003 -XX:MaxPermSize = 256m org.apache.spark.executor.CoarseGrainedExecutorBackend --driver-url spark://CoarseGrainedScheduler@172.31 .0.92:37386 --executor-id 2 --hostname ip-172-31-6-141.ec2.internal --cores 8 --app-id application_1455246675722_0023 --user-class-path file:/ tmp / hadoop- root / nm-local-dir / usercache / root / appcache / application_1455246675722_0023 / container_1455246675722_0023_01_000003 / app .jar 1&gt; / mnt / yarn / logs / application_1455246675722_0023 / container_1455246675722_0023_01_000003 / stdout 2&gt;的/ mnt /纱线/日志/ application_1455246675722_0023 / container_1455246675722_0023_01_000003 /标准错误       | - 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       | - 23329 23292 23292 23206(python)90 6 39464521728 23281 python -m pyspark.daemon       | - 23213 23206 23206 23206(java)1168 61 11967115264 359820 / usr / lib / jvm / java-7-openjdk-amd64 / bin / java -server -XX:OnOutOfMemoryError = kill%p -Xms10240m -Xmx10240m -Djava.io。 tmpdir = / tmp / hadoop-root / nm-local-dir / usercache / root / appcache / application_1455246675722_0023 / container_1455246675722_0023_01_000003 / tmp -Dspark.driver.port = 37386 -Dspark.yarn.app.container.log.dir = / mnt / yarn / logs / application_1455246675722_0023 / container_1455246675722_0023_01_000003 -XX:MaxPermSize = 256m org.apache.spark.executor.CoarseGrainedExecutorBackend --driver-url spark://CoarseGrainedScheduler@172.31.0.92:37386 --executor-id 2 --hostname ip-172 -31-6-141.ec2.internal --cores 8 --app-id application_1455246675722_0023 --user-class-path file:/ tmp / hadoop-root / nm-local-dir / usercache / root / appcache / application_1455246675722_0023 / container_1455246675722_0023_01_000003 /的应用的.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是非常错误的。

1 个答案:

答案 0 :(得分:7)

我正在运行的命令是

spark-submit --executor-cores 8 ...

事实证明,执行者核心标志并没有做我认为的事情。它生成了8个pyspark.daemon进程副本,运行8个工作进程副本来运行作业。每个进程使用38GB的虚拟内存,这是不必要的大,但8 * 38~300,所以这解释了。

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