当我在spark中运行大连接时,我正在使执行程序超出内存限制

时间:2015-04-07 14:44:42

标签: java memory apache-spark yarn

我在spark的大连接驱动程序中遇到以下错误。

我们有3个节点,32GB内存,连接总输入大小为150GB。 (当输入文件大小为50GB时,相同的应用程序正常运行)

我已将storage.memoryFraction设置为0.2并将shuffle.memoryFraction设置为0.2。但仍然继续运行beyong物理限制错误。

  

15/04/07 19:58:17 INFO yarn.YarnAllocator:标记为失败的容器:   container_1426882329798_0674_01_000002。退出状态:143。诊断:   容器   [pid = 51382,containerID = container_1426882329798_0674_01_000002]是   超越物理内存限制。当前用法:16 GB 16 GB   使用的物理内存;使用16.8 GB的33.6 GB虚拟内存。杀   容器。转储进程树的转储   container_1426882329798_0674_01_000002:           | - PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS)SYSTEM_TIME(MILLIS)VMEM_USAGE(BYTES)RSSMEM_USAGE(PAGES)   FULL_CMD_LINE           | - 51387 51382 51382 51382(java)717795 50780 17970946048 4221191 /usr/jdk64/jdk1.7.0_45/bin/java -server   -XX:OnOutOfMemoryError = kill%p -Xms14336m -Xmx14336m -verbose:gc -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -XX:+ StartAttachListener -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 9010 -Dcom.sun.management.jmxremote.local.only = false -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false -Dlog4j.configuration = file:/ softwares / log4j .properties -Djava.io.tmpdir = / hadoop / yarn / local / usercache / hdfs / appcache / application_1426882329798_0674 / container_1426882329798_0674_01_000002 / tmp   -Dspark.driver.port = 20763 -Dspark.ui.port = 0 -Dspark.yarn.app.container.log.dir = / hadoop / yarn / log / application_1426882329798_0674 / container_1426882329798_0674_01_000002   org.apache.spark.executor.CoarseGrainedExecutorBackend --driver-url   akka.tcp://sparkDriver@maxiq2.augmentiq.in:20763 /用户/ CoarseGrainedScheduler   --executor-id 1 --hostname maxiq1.augmentiq.in --cores 4 --app-id application_1426882329798_0674 --user-class-path   文件:/ hadoop的/纱线/本地/ usercache / HDFS /应用程序缓存/ application_1426882329798_0674 / container_1426882329798_0674_01_000002 /的应用的.jar

请帮我解决这个问题?

2 个答案:

答案 0 :(得分:3)

我们之前遇到过类似的问题。尝试改变火花的所有配置,但没有运气。

后来我们发现这是数据的问题。我们在连接中使用的键有多行。一些密钥在两个表中都有大约4000-5000行。因此,火花创造了大约5k * 5k记录的密钥,使得执行者的内存运行。

您可能需要检查一次数据。对输入数据进行一些分析,例如按键分组,然后获取计数。这可能会给你一些见解。

答案 1 :(得分:-1)

您可以尝试将--executor-memory设置为低于此限制的内容。限制在yarn-site.xml中定义,如果未设置则默认为默认值。

如果节点有更多内存,您也可以尝试增加限制。详细信息可在http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/中找到一些大小调整说明。

一般情况下请记住,您的资源分配是由YARN控制的,熟悉纱线工作和调试是一个神的想法