我正在尝试运行 map 缩减作业。我使用 eclipse 创建了一个可运行的 jar,我的输入格式类和输出格式类与启 Action 业的类位于同一包中。所有这些都包含在 jar 中。我设置输入和输出格式类如下:
job.setInputFormatClass(fully_qualified_name_of_my_input_class.class);
job.setOutputFormatClass(fully_qualified_name_of_my_output_class.class);
但是当我使用 hadoop jar myJar.jar
执行 jar 时,我得到输出格式类的类未找到异常,但我的输入格式类没有得到它。如何纠正这个问题?这里是堆栈跟踪
java.lang.RuntimeException: java.lang.ClassNotFoundException: my-class-name
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:867)
at org.apache.hadoop.mapreduce.JobContext.getOutputFormatClass(JobContext.java:235)
at org.apache.hadoop.mapred.Task.initialize(Task.java:513)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:353)
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:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.ClassNotFoundException: my-class-name
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:820)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:865)
... 8 more
最佳答案
在设置作业时尝试添加以下内容。
job.setJarByClass(fully_qualified_name_of_my_input_class.class)
参见Hadoop query regarding setJarByClass method of Job class了解更多信息。
关于java - 使用 hadoop Map Reduce 的自定义输出格式时未找到类异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19592497/