2015-02-02 5 views
0

Я пытаюсь запустить пример программы из Hadoop в книге действий. Пример 4-1. Это просто простая программа MR для предоставления разделенных запятыми ключей и пар значений.Ошибка getJobStatus в Hadoop

Я получаю сообщение об ошибке с помощью метода JobClient.runJob(). Я не знаю, где я ошибся, это то, что дано в книге. Любая помощь очень ценится

import java.io.IOException; 
import java.util.Iterator; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.FileOutputFormat; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.mapred.KeyValueTextInputFormat; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer; 
import org.apache.hadoop.mapred.Reporter; 
import org.apache.hadoop.mapred.TextOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 
import org.apache.hadoop.mapred.LocalJobRunner; 

public class MyJob extends Configured implements Tool { 

public static class MapClass extends MapReduceBase 
     implements Mapper<Text, Text, Text, Text> { 

    public void map(Text key, Text value, 
        OutputCollector<Text, Text> output, 
        Reporter reporter) throws IOException { 

     output.collect(value, key); 
    } 
} 

public static class Reduce extends MapReduceBase 
     implements Reducer<Text, Text, Text, Text> { 

    public void reduce(Text key, Iterator<Text> values, 
         OutputCollector<Text, Text> output, 
         Reporter reporter) throws IOException { 

     String csv = ""; 
     while (values.hasNext()) { 
      if (csv.length() > 0) csv += ","; 
      csv += values.next().toString(); 
     } 
     output.collect(key, new Text(csv)); 
    } 
} 

public int run(String[] args) throws Exception { 
    Configuration conf = getConf(); 

    JobConf job = new JobConf(conf, MyJob.class); 

    Path in = new Path(args[0]); 
    Path out = new Path(args[1]); 
    FileInputFormat.setInputPaths(job, in); 
    FileOutputFormat.setOutputPath(job, out); 

    job.setJobName("MyJob"); 
    job.setMapperClass(MapClass.class); 
    job.setReducerClass(Reduce.class); 

    job.setInputFormat(KeyValueTextInputFormat.class); 
    job.setOutputFormat(TextOutputFormat.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(Text.class); 
    job.set("key.value.separator.in.input.line", ","); 

    JobClient.runJob(job); 

    return 0; 
} 

public static void main(String[] args) throws Exception { 
    int res = ToolRunner.run(new Configuration(), new MyJob(), args); 

    System.exit(res); 
} 
} 

Ошибка:

Exception in thread "main" java.lang.VerifyError: (class: org/apache/hadoop/mapred/LocalJobRunner, method: getJobStatus signature: (Lorg/apache/hadoop/mapreduce/JobID;)Lorg/apache/hadoop/mapreduce/JobStatus;) Wrong return type in function 
    at org.apache.hadoop.mapred.JobClient.init(JobClient.java:548) 
    at org.apache.hadoop.mapred.JobClient.<init>(JobClient.java:520) 
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1411) 
    at MyJob.run(MyJob.java:71) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at MyJob.main(MyJob.java:77) 

ответ

0

я наткнулся на тот же вопрос здесь. Чтобы оставить заметку, проблема в том, что и mr1, и jarn jar присутствуют в classpath, и классы смешиваются.