一、问题
运行yarn的MR程序,发现出现问题,报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/v2/app/MRAppMaster
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.v2.app.MRAppMaster
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
这个问题在hadoop-mapreduce-user邮件列表上面有人讨论过,地址: http://mail-archives.apache.org/mod_mbox/hadoop-mapreduce-user/201207.mbox/browser 不过不深入。
二、分析
这个问题,很明显一看就是类加载不到,我们肯定首先去看下这个类在哪里,在包hadoop-mapreduce-client-app-2.0.0-alpha.jar中,路径在$HADOOP_HOME/share/hadoop/mapreduce(在2.0版本中,后续我估计这个可能会调整)
这个我猜应该是classpath的问题,所以我很想弄到启动container的时候的参数。
我们知道启动是通过shell命令启动,在ContainerLaunch.java中,我最终调试发现了启动参数(下面的这段代码其实最后会写入到/tmp/nm-local-dir/nmPrivate/application_1350793073454_0005/container_1350793073454_0005_01_000001/launch_container.sh这样类似的文件中):
#!/bin/bash
export YARN_LOCAL_DIRS="/tmp/nm-local-