Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop找不到映射器类_Java_Hadoop_Mapreduce_Mapper - Fatal编程技术网

Java Hadoop找不到映射器类

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

我是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.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>