2016-04-09 5 views
0

私はWordCount MapReduceジョブを持っています。これはhadoop cliから実行されたときにうまく実行され、出力が与えられます。しかし、私がoozieを使ってジョブを実行すると、エラーが発生します: 'エラー:java.io.IOException:キーからタイプが一致しません:予期されるorg.apache.hadoop.io.Text、org.apache.hadoop.io.LongWritable'ここでoozieジョブにエラーが発生しました

コードは、私がoozie

oozie job -oozie http://localhost:11000/oozie -config /home/cloudera/job.properties -run 
を介して実行すると、私のworkflow.xmlがここ

<workflow-app xmlns="uri:oozie:workflow:0.1" name="map-reduce-wf"> 
<start to="mr-node"/> 
<action name="mr-node"> 
    <map-reduce> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
    <configuration> 
    <property> 
     <name>mapred.mapper.new-api</name> 
     <value>true</value> 
    </property> 
    <property> 
     <name>mapred.reducer.new-api</name> 
     <value>true</value> 
    </property> 
    <property> 
     <name>mapred.job.queue.name</name> 
     <value>${queueName}</value> 
    </property> 
    <property> 
     <name>mapreduce.mapper.class</name> 
     <value>Drivers.WordCount$WordMap</value> 
    </property> 
    <property> 
     <name>mapreduce.reducer.class</name> 
     <value>Drivers.WordCount$RedForSum</value> 
    </property> 
    <property> 
     <name>mapred.output.key.class</name> 
     <value>org.apache.hadoop.io.Text</value> 
    </property> 
    <property> 
     <name>mapred.output.value.class</name> 
     <value>org.apache.hadoop.io.IntWritable</value> 
    </property> 
    <property> 
     <name>mapred.input.dir</name> 
     <value>${inputDir}</value> 
    </property> 
    <property> 
     <name>mapred.output.dir</name> 
     <value>${outputDir}</value> 
    </property> 
    </configuration> 
    </map-reduce> 
    <ok to="end"/> 
    <error to="fail"/> 
</action> 
    <kill name="fail"> 
    <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 
    <end name="end"/> 
</workflow-app> 

ある

package Drivers; 

import java.io.IOException; 
import java.util.StringTokenizer; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 

public class WordCount extends Configured implements Tool 
{ 

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

    @Override 
    public int run(String[] args) throws Exception 
    { 

    Job job = Job.getInstance(getConf(), "Tool Job"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(WordMap.class); 
    job.setReducerClass(RedForSum.class); 
    job.setMapOutputKeyClass(Text.class); 
    job.setMapOutputValueClass(IntWritable.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 
    return job.waitForCompletion(true) ? 0 : 1; 
    } 


    //map method 
    public static class WordMap extends Mapper<LongWritable,Text,Text,IntWritable> 
    { 
     public void map(LongWritable k, Text v,Context con) throws IOException, InterruptedException 
     { 
      String line=v.toString(); 
      StringTokenizer t = new StringTokenizer(line); 
      while(t.hasMoreTokens()) 
      { 
       String word=t.nextToken(); 
       con.write(new Text(word),new IntWritable(1)); 
      } 

     } 
    } 
    //reducer method 
    public static class RedForSum extends Reducer<Text, IntWritable,Text,IntWritable> 
    { 
     public void reduce(Text k, Iterable<IntWritable> vlist, Context con) throws IOException, InterruptedException 
     { 
      int tot=0; 
      for(IntWritable v:vlist) 
      tot+=v.get(); 
      con.write(k, new IntWritable(tot)); 
     } 
    } 
} 

ですそれは私にエラーを投げ

Error: java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, received org.apache.hadoop.io.LongWritable at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1072) at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:715) at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89) at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112) at org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

は、誰かが私が間違っていたところ、私に知らせてくださいすることができます。

ありがとうございました。

答えて

0

問題はワークフローXMLにあるようです。ここでプロパティ名はmapreduce.mapper.classmapreduce.reducer.classの代わりにmapreduce.map.classmapreduce.reduce.classである必要があります。したがって、変更されたワークフローにはこれらのプロパティが必要です。この詳細については

<property> 
     <name>mapreduce.map.class</name> 
     <value>Drivers.WordCount$WordMap</value> 
    </property> 
    <property> 
     <name>mapreduce.reduce.class</name> 
     <value>Drivers.WordCount$RedForSum</value> 
    </property> 

私は、XML `エラー変更する場合、私は次のエラーを取得していますhere

+0

をREFEREてください:java.lang.RuntimeExceptionを:にjava.lang.ClassNotFoundException:クラスDrivers.WordCount $ WordMapありませんfound ' – Ashok

+0

@Ashok 'Drivers.WordCount.WordMap'と' Drivers.WordCount.RedForSum'である必要があります。これらの値を試してみてください。 – YoungHobbit

+0

@ Raju Sharma、そうです。しかし、 'mapred.mapoutput.key.class'タグと' mapred.mapoutput.value.class'タグをワークフローに追加するだけで、正常に終了しました。 ' \t \t mapred.mapoutput.key.class \t \t org.apache.hadoop.io.Text \t \t \t \t mapred.mapoutput.value.class \t \t org.apache.hadoop.io.IntWritable \t ' – Ashok

関連する問題