title: Hadoop can not find the mapper class
body: <p>I am new to Hadoop and I want to run a MapReduce job. However, I've got the error that the hadoop can not find the mapper class. This is the error:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I checked the permission of my jar file and it is fine. Here it is the permission of the jar file:</p>
  
  <pre><code>-rwxrwxrwx.
  </code></pre>
  
  <p>Here it is the code for the code that launches the mapreduce job:</p>
  
  <pre><code>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);
  }
  }
  </code></pre>
  
  <p>And here it is the mapper class (TransMapper1):</p>
  
  <pre><code>import java.io.IOException;
  import java.util.StringTokenizer;
  import org.apache.hadoop.io.DoubleWritable;
  import org.apache.hadoop.io.IntWritable;
  import org.apache.hadoop.io.LongWritable;
  import org.apache.hadoop.io.Text;
  import org.apache.hadoop.mapreduce.Mapper;
  
  public class TransMapper1 extends  Mapper&lt;LongWritable, Text, LongWritable, DnaWritable&gt; {
  
      @Override
      public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  
          String line = value.toString();
          StringTokenizer tokenizer = new StringTokenizer(line);
          LongWritable bamWindow = new LongWritable(Long.parseLong(tokenizer.nextToken()));
          LongWritable read = new LongWritable(Long.parseLong(tokenizer.nextToken()));
          LongWritable refWindow = new LongWritable(Long.parseLong(tokenizer.nextToken()));
          IntWritable chr = new IntWritable(Integer.parseInt(tokenizer.nextToken()));
          DoubleWritable dist = new DoubleWritable(Double.parseDouble(tokenizer.nextToken()));
          DnaWritable dnaW = new DnaWritable(bamWindow,read,refWindow,chr,dist);
          context.write(bamWindow,dnaW);
      }
  }
  </code></pre>
  
  <p>I am compiling the package using following commands:</p>
  
  <pre><code>javac -classpath $MR_HADOOPJAR ${rootPath}mp/src/*.java
  jar cvfm $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class
  </code></pre>
  
  <p>This is the results of jar -tf mp/src/mp.jar command:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>And I am running the job with this:</p>
  
  <pre><code>mpJar=${rootPath}mp/src/mp.jar
  mp_exec=mp
  export HADOOP_CLASSPATH=$mpJar
  hadoop $mp_exec &lt;input path&gt;
  </code></pre>
  
  <p>Also, I tried this command too:</p>
  
  <pre><code>hadoop jar $mp_exec &lt;input path&gt;
  </code></pre>
  
  <p>I changed the way I create the jar file into this command:</p>
  
  <pre><code>jar cf $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class
  </code></pre>
  
  <p>And with this change, the the error has been changed to this:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>So, before my problem was that the program can not find the mapper class, right now it can not find the main class!!! any thoughts??</p>
  
  <p>Thank you guys</p>