hadoop - 容器运行超出物理内存限制
问题描述
我有一个处理 1.4 Tb 数据的 MapReduce 作业。在执行此操作时,我收到如下错误。
拆分数为 6444。在开始作业之前,我设置了以下设置:
conf.set("mapreduce.map.memory.mb", "8192");
conf.set("mapreduce.reduce.memory.mb", "8192");
conf.set("mapreduce.map.java.opts.max.heap", "8192");
conf.set("mapreduce.map.java.opts", "-Xmx8192m");
conf.set("mapreduce.reduce.java.opts", "-Xmx8192m");
conf.set("mapreduce.job.heap.memory-mb.ratio", "0.8");
conf.set("mapreduce.task.timeout", "21600000");
错误:
2018-05-18 00:50:36,595 INFO [AsyncDispatcher event handler] org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl: Diagnostics report from attempt_1524473936587_2969_m_004719_3: Container [pid=11510,containerID=container_1524473936587_2969_01_004894] is running beyond physical memory limits. Current usage: 8.1 GB of 8 GB physical memory used; 8.8 GB of 16.8 GB virtual memory used. Killing container.
Dump of the process-tree for container_1524473936587_2969_01_004894 :
|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE
|- 11560 11510 11510 11510 (java) 14960 2833 9460879360 2133706 /usr/lib/jvm/java-7-oracle-cloudera/bin/java
-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx8192m -Djava.io.tmpdir=/sdk/7/yarn/nm/usercache/administrator/appcache/application_1524473936587_2969/container_1524473936587_2969_01_004894/tmp
-Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1524473936587_2969/container_1524473936587_2969_01_004894
-Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 10.106.79.75 41869 attempt_1524473936587_2969_m_004719_3 4894
|- 11510 11508 11510 11510 (bash) 0 0 11497472 679 /bin/bash -c /usr/lib/jvm/java-7-oracle-cloudera/bin/java
-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN -Xmx8192m -Djava.io.tmpdir=/sdk/7/yarn/nm/usercache/administrator/appcache/application_1524473936587_2969/container_1524473936587_2969_01_004894/tmp
-Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1524473936587_2969/container_1524473936587_2969_01_004894
-Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Dhadoop.root.logfile=syslog org.apache.hadoop.mapred.YarnChild 10.106.79.75 41869 attempt_1524473936587_2969_m_004719_3 4894 1>/var/log/hadoop-yarn/container/application_1524473936587_2969/container_1524473936587_2969_01_004894/stdout 2>/var/log/hadoop-yarn/container/application_1524473936587_2969/container_1524473936587_2969_01_004894/stderr
Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
任何帮助将非常感激!
解决方案
设置 mapreduce.map.memory.mb 将设置运行 mapper 的容器的物理内存大小(mapreduce.reduce.memory.mb 将对 reducer 容器做同样的事情)。
确保您也调整了堆值。在较新版本的 YARN/MRv2 中,设置 mapreduce.job.heap.memory-mb.ratio 可用于自动调整。默认值为 0.8,因此无论容器大小的 80% 将被分配为堆。否则,使用 mapreduce.map.java.opts.max.heap 和 mapreduce.reduce.java.opts.max.heap 设置手动调整。
顺便说一句,我相信 1 GB 是默认值,而且非常低。我建议阅读以下链接。它提供了对 YARN 和 MR 内存设置、它们之间的关系以及如何根据集群节点大小(磁盘、内存和内核)设置一些基线设置的良好理解。
推荐阅读
- javascript - 在从 getStaticProps 返回的组件中获取未定义的道具
- java - 使用 ExecutorService 而不是 AsyncTask 的 Google Directions API
- graphql - GraphQL 与规范化数据结构的优势
- excel - 错误:对象变量或未设置块
- reactjs - 在我们的缓存中找不到任何与“最新”匹配的“cra-template-typescript”版本
- azure-application-insights - ApplicationInsights>TelemetryChannel>StorageFolder 中的更改未反映
- angular - 如何使用 Angular TestBed 将 Jasmine 间谍对象作为提供者传递
- c++ - 使用递归分段错误核心转储对数组进行排序
- amazon-web-services - AWS API-Gateway 缓存设置在控制台中不可见
- javascript - 如何在 macOS 的 Electrom 无框窗口中制作原始控件?