1

新しい API (0.20.2) を使用して最大の素数を見つける単純な map reduce プログラムを作成しようとしています。これは、私の Map と reduce クラスがどのように見えるかです…

public class PrimeNumberMap extends Mapper<LongWritable, Text, IntWritable, IntWritable> {

public void map (LongWritable key, Text Kvalue,Context context) throws IOException,InterruptedException
{
    Integer value = new Integer(Kvalue.toString());
    if(isNumberPrime(value))
    {
            context.write(new IntWritable(value), new IntWritable(new Integer(key.toString())));
    }
}

boolean isNumberPrime(Integer number)
{
    if (number == 1) return false;
     if (number == 2) return true;

     for (int counter =2; counter<(number/2);counter++)
     {
         if(number%counter ==0 )
             return false;
     }
            return true;

}
}
public class PrimeNumberReduce extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable>  {

public void reduce ( IntWritable primeNo, Iterable<IntWritable> Values,Context context) throws IOException ,InterruptedException
{
    int maxValue = Integer.MIN_VALUE;
    for (IntWritable value : Values)
    {
        maxValue=  Math.max(maxValue, value.get());
    }
    //output.collect(primeNo, new IntWritable(maxValue));
    context.write(primeNo, new IntWritable(maxValue));  }

}  

 public static void main(String[] args)  throws IOException, InterruptedException, ClassNotFoundException{

    if (args.length ==0)
    {
        System.err.println(" Usage:\n\tPrimenumber <input Directory> <output Directory>");
        System.exit(-1);
    }
    Job job = new Job();
    job.setJarByClass(Main.class);

    job.setJobName("Prime");
    // Creating job configuration object

    FileInputFormat.addInputPath(job, new Path (args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.setMapOutputKeyClass(IntWritable.class);
    job.setMapOutputValueClass(IntWritable.class);

    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(IntWritable.class);
    String star ="*********************************************";
    System.out.println(star+"\n Prime number computer \n"+star);
    System.out.println(" Application started ... keeping fingers crossed :/ ");
    System.exit(job.waitForCompletion(true)?0:1);

}

}

マップのキーの不一致に関するエラーが引き続き発生します

java.io.IOException: マップからのキーの型の不一致: 予想される org.apache.hadoop.io.IntWritable、org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask で org.apache.hadoop.io.LongWritable を受け取りました.java:1034) org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:595) org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80) org.apache. hadoop.mapreduce.Mapper.map(Mapper.java:124) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java: 668) org.apache.hadoop.mapred.MapTask.run(MapTask.java:334) で org.apache.hadoop.mapred.Child$4.run(Child.java:270) で java.security.AccessController.doPrivileged(ネイティブ メソッド) で javax.security.auth.Subject.doAs(Subject.java:396) org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1109) で org.apache.hadoop.mapred.Child.main(Child.java:264) 2012-06-13 14:27:21,116 INFO org.apache.hadoop.mapred.Task: タスクのクリーンアップを実行しています

何が間違っているのか教えてください。私はすべてのフックと詐欺師を試しました。

4

3 に答える 3

8

メイン ブロックで Mapper クラスまたは Reducer クラスを構成していないため、デフォルトの Mapper が使用されています。これは ID マッパーと呼ばれ、入力として受け取る各ペアが出力されます (したがって、LongWritable が出力キーとして使用されます)。

job.setMapperClass(PrimeNumberMap.class);
job.setReducerClass(PrimeNumberReduce.class);
于 2012-06-13T19:26:54.320 に答える
0

私は Hadoop mapreduce プログラムの初心者です。

マッピングするときは使用しますIntWritableが、値をフォーマットで減らし、IntWritable結果を double に変換してからDoubleWritableコンテキスト書き込みで使用します。

実行時に失敗します。

map の隠れた int を reduce の double に処理する私の方法は次のとおりです。

Mapper(LongWritable,Text,Text,DoubleWritable)
Reducer(Text,DoubleWritable,Text,DoubleWritable)
job.setOutputValueClass(DoubleWritable.Class)
于 2013-12-09T15:02:37.013 に答える