主要报错代码如下,运行查看结果显示cat: '/output/*': No such file or directory 错误。
[2025-03-11 05:54:52.055]Container [pid=21342,containerID=container_1741697581161_0002_01_000002] is running 378255872B beyond the 'VIRTUAL' memory limit. Current usage: 159.2 MB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used. Killing container.
这表明 Map 任务使用的虚拟内存超出了 YARN 为其分配的限制,导致容器被 YARN 杀死,最终作业失败。
在作业运行失败的情况下,/output
目录可能没有被正确创建或者没有生成结果文件。通常,只有当作业成功完成时,才会在指定的输出目录(这里是 /output
)下生成结果文件。
解决办法
1. 增加容器的内存限制
可以通过修改 yarn-site.xml
和 mapred-site.xml
文件来增加容器的内存限制。
- 在
yarn-site.xml
中添加或修改以下配置:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value> <!-- 增加节点管理器的总可用内存,单位为 MB -->
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value> <!-- 增加每个容器的最大可用内存,单位为 MB -->
</property>
- 在
mapred-site.xml
中添加或修改以下配置:
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value> <!-- 增加 Map 任务的内存分配,单位为 MB -->
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1638m</value> <!-- 增加 Map 任务 JVM 的堆内存大小,通常为 mapreduce.map.memory.mb 的 0.8 倍 -->
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value> <!-- 增加 Reduce 任务的内存分配,单位为 MB -->
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx1638m</value> <!-- 增加 Reduce 任务 JVM 的堆内存大小,通常为 mapreduce.reduce.memory.mb 的 0.8 倍 -->
</property>
修改完成后,重启 Hadoop 集群使配置生效:
stop-all.sh
sbin/start-all.sh
2. 重新运行作业
在修改配置并重启集群后,删除之前可能存在的 output
目录(如果有的话),然后重新运行 WordCount 程序:
hdfs dfs -rm -r /output
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /input /output
3. 检查作业运行情况
作业运行完成后,使用以下命令查看输出结果:
hdfs dfs -ls /output
hdfs dfs -cat /output/*
通过以上步骤,应该可以解决内存限制导致的作业失败问题,并成功生成 output
目录和结果文件。