1、运行环境:
CentOS6.8(Linux hadoop101 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux),java version "1.8.0_144",Hadoop 2.7.2;
2、问题描述与分析过程:
在hadoop的伪分布模式,在Yarn上面执行MapReduce(wordcount)的时候报如下错误:
18/01/31 23:48:30 INFO mapreduce.Job: Job job_1517413416343_0001 running in uber mode : false
18/01/31 23:48:30 INFO mapreduce.Job: map 0% reduce 0%
18/01/31 23:48:35 INFO mapreduce.Job: Task Id : attempt_1517413416343_0001_m_000000_0, Status : FAILED
Exception from container-launch.
Container id: container_1517413416343_0001_01_000002
Exit code: 1
Stack trace: ExitCodeException exitCode=1:
at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)
at org.apache.hadoop.util.Shell.run(Shell.java:456)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Container exited with a non-zero exit code 1
18/01/31 23:48:41 INFO mapreduce.Job: Task Id : attempt_1517413416343_0001_m_000000_1, Status : FAILED
Exception from container-launch.
Container id: container_1517413416343_0001_01_000003
Exit code: 1
Stack trace: ExitCodeException exitCode=1:
at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)
at org.apache.hadoop.util.Shell.run(Shell.java:456)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Container exited with a non-zero exit code 1
18/01/31 23:48:47 INFO mapreduce.Job: Task Id : attempt_1517413416343_0001_m_000000_2, Status : FAILED
Exception from container-launch.
Container id: container_1517413416343_0001_01_000004
Exit code: 1
Stack trace: ExitCodeException exitCode=1:
at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)
at org.apache.hadoop.util.Shell.run(Shell.java:456)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
初步判断是container容器创建出错了,从网上多方查询,非正确答案,都不能解决问题,后面查看container容器日志的时候发现如下问题描述:
[lyh@hadoop101 userlogs]$ more application_1517413416343_0001/container_1517413416343_0001_01_000003/stderr
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000f4d80000, 105381888, 0) failed; error='无法分配内存' (errno=12)
[lyh@hadoop101 userlogs]$ more application_1517413416343_0001/container_1517413416343_0001_01_000003/stdout
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 105381888 bytes for committing reserved memory.
很明显了,显示JVM内存分配出错了,于是就想到执行free命令查看一下内存使用情况,在执行free -h和df -h,显示如下结果:
[AAA@BBB hsperfdata_AAA]$ free -h
total used free shared buffers cached
Mem: 1.9G 1.4G 541M 256K 30M 63M
-/+ buffers/cache: 1.3G 636M
Swap: 0B 0B 0B
[AAA@BBB hsperfdata_AAA]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 15G 3.4G 11G 25% /
tmpfs 996M 0 996M 0% /dev/shm
/dev/sda1 190M 39M 142M 22% /boot
/dev/sda3 2.0G 3.0M 1.9G 1% /swap
通过以上结果发现,实际内存才使用了1.4g,还有500多m呢,就比较纳闷为什么还出现内存的问题,最后将问题信息发送到stackoverflow上面,说是因为swap分区的问题;回头通过free和df再次查看,发现swap分区使用0和0,通过cat查看/etc/fstab文件发现/dev/sda3是ext4类型的,不是swap类型的,相当于swap分区没有启用,至于为什么swap分区没有启用就会出现内存的问题,怎么就不够用还需要进一步的研究。
3、解决办法与步骤:
思路:先将/dev/sda3分区转换成swap类型,在将/dev/sda3启用swap分区,重启就解决问题,整个过程需要root权限。
步骤:
3.1、将/dev/sda3分区转换成swap类型;
fdisk /dev/sda 选择 p t 3 L 82 w完成转换
3.2、将/dev/sda3启用swap分区
由于/dev/sda3是装系统的时候安装的,已经挂载在了系统上,需要先卸载后启用;
卸载:umount /dev/sda3
制作swap区:mkswap /dev/sda3
启用swap分区:swapon /dev/sda3
编辑/etc/fstab文件:将原来的/sda3分区的uuid行注释掉,在最后一行添加如下信息后保存退出(此步骤很重要,否则重启报错)
/dev/sda3 swap swap defaults 0 0
3.3、重启电脑,执行free和df命令,swap分区有了。
3.4、再次运行hadoop,完美解决问题。
4、补充说明:
本次swap分区没有启用,是因为在Linux系统安装的时候配置/swap分区的时候没有将文件系统类型改为swap,使用了默认的ext4。当然也可以通过创建swapfile文件添加swap分区解决问题。
5、部分截图:
![](https://img.haomeiwen.com/i6932244/e42fa800120c608c.png)
![](https://img.haomeiwen.com/i6932244/e4caa797ae89bbf0.png)
![](https://img.haomeiwen.com/i6932244/b50a71f45b75efd6.png)
![](https://img.haomeiwen.com/i6932244/adacbd04b17c5b2f.png)
![](https://img.haomeiwen.com/i6932244/a7bf082ef014c2c9.png)
网友评论