Java Hadoop找不到映射器类
我是Hadoop新手,我想运行MapReduce作业。但是,我有一个错误,hadoop找不到mapper类。这就是错误:Java Hadoop找不到映射器类,java,hadoop,mapreduce,mapper,Java,Hadoop,Mapreduce,Mapper,我是Hadoop新手,我想运行MapReduce作业。但是,我有一个错误,hadoop找不到mapper类。这就是错误: INFO mapred.JobClient: Task Id : attempt_201608292140_0023_m_000000_0, Status : FAILED java.lang.RuntimeException: java.lang.ClassNotFoundException: TransMapper1 at org.apache.hadoop.co
INFO mapred.JobClient: Task Id : attempt_201608292140_0023_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: TransMapper1
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:718)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
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:422)
我检查了我的jar文件的权限,一切正常。这里是jar文件的权限:
-rwxrwxrwx.
以下是启动mapreduce作业的代码:
import java.io.File;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class mp{
public static void main(String[] args) throws Exception {
Job job1 = new Job();
job1.setJarByClass(mp.class);
FileInputFormat.addInputPath(job1, new Path(args[0]));
String oFolder = args[0] + "/output";
FileOutputFormat.setOutputPath(job1, new Path(oFolder));
job1.setMapperClass(TransMapper1.class);
job1.setReducerClass(TransReducer1.class);
job1.setMapOutputKeyClass(LongWritable.class);
job1.setMapOutputValueClass(DnaWritable.class);
job1.setOutputKeyClass(LongWritable.class);
job1.setOutputValueClass(Text.class);
}
}
这里是mapper类(TransMapper1):
这是jar-tf mp/src/mp.jar命令的结果:
META-INF/
META-INF/MANIFEST.MF
mnt/miczfs/tide/mp/src/DnaWritable.class
mnt/miczfs/tide/mp/src/mp.class
mnt/miczfs/tide/mp/src/TransMapper1.class
mnt/miczfs/tide/mp/src/TransMapper2.class
mnt/miczfs/tide/mp/src/TransReducer1.class
mnt/miczfs/tide/mp/src/TransReducer2.class
我用这个来执行任务:
mpJar=${rootPath}mp/src/mp.jar
mp_exec=mp
export HADOOP_CLASSPATH=$mpJar
hadoop $mp_exec <input path>
通过此更改,错误已更改为:
Exception in thread "main" java.lang.ClassNotFoundException: mp
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
所以,以前我的问题是程序找不到mapper类,现在它找不到主类!!!有什么想法吗
谢谢大家HADOOP\u类路径必须指定JAR文件所在的文件夹,因此无法找到类定义。从
HADOOP
命令运行Mapreduce作业需要JAR文件、mainclass和其他参数
Usage: hadoop jar <jar> [mainClass] args...
用法:hadoop jar[mainClass]参数。。。
因此,运行应用程序jar的命令应该是:
hadoop jar $mpJar $mp_exec <inputpath>
hadoop jar$mpJar$mp\u exec
实际上,您收到的错误来自一个缺少的类@java.lang.ClassNotFoundException:TransMapper1,您确定已将所有java源代码编译到HDFS上的正确目录中,以便hadoop可以找到TransMapper1吗?您还可以尝试从类中创建一个jar文件并在中运行它hadoop@Dean219我添加了编译代码和运行代码的方法。你能告诉我把编译好的文件放在HDFS的什么地方吗?我只把输入文件移到了HDFS。我也应该移动jar文件吗?我添加了编译和运行代码的方式,并将HADOOP_类路径设置为jar文件的位置。但是jar文件不在HDFS上。它是本地的,这会导致问题吗?我没有说明mp.class文件的位置,我纠正了它,它工作了。谢谢你的回答。但这样调用会使参数0成为$mp_exec。当我修正了论点的索引。它产生了同样的错误。。仍然不工作没有arg 0将是main类($mp_exec)之后的第一个arg-在您的情况下,它将是inputpathit不是真的,先生,我只是在mp.java上执行任何操作之前打印参数的数量,它将打印2!!!args用于类($mp_exec)-而不是jar($mpJar)…如上所述运行,并保留所讨论的代码(mp.class
),应该可以工作…请参阅
jar cf $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class
Exception in thread "main" java.lang.ClassNotFoundException: mp
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.util.RunJar.main(RunJar.java:153)
Usage: hadoop jar <jar> [mainClass] args...
hadoop jar $mpJar $mp_exec <inputpath>