我有一个奇怪的问题。我有自己的文件系统实现,而不是默认的distributedfilesystem。我在fs.default.name和impl中添加了我的文件系统。当hadoop执行开始时(teragen程序),我可以看到写入和读取正好发生在来自JobTracker的文件job.xml,job.jar等。 但是,一旦映射任务在jobtracker中分配,它就会产生ioexception,表示找不到分割类。我确认所有类都出现在示例jar中。
此外,为了缩小问题范围,我通过更改fs.default.name重新使用默认分布式系统完全相同的设置。它完美无缺!!。
命令
bin/hadoop jar hadoop-examples-1.2.1.jar teragen 100000 /user/hduser/terasort-input
最初我觉得这是一个类路径问题,但是,如果相同的设置适用于默认的分布式系统,那么问题可能出在哪里?我在文件系统中的实现如何影响jobtracker和classpath?
我非常感谢你的帮助。
2013-11-06 12:30:35,018 INFO org.apache.hadoop.mapred.TaskInProgress: Error from attempt_201311061227_0001_m_000000_0: java.io.IOException: Split class PLLorg.apache.hadoop.examples.terasort.TeraGen$RangeInputFormat$RangeInputSplit not found
at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:381)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:406)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:366)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:416)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.ClassNotFoundException: PLLorg.apache.hadoop.examples.terasort.TeraGen$RangeInputFormat$RangeInputSplit
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:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:266)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:810)
at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:379)
答案 0 :(得分:1)
请检查有关路径转换问题的文件系统实现,如下所示:
您可能还需要查看: