1

私はMRUnitで遊んでいて、単語数と単体テストのチュートリアルに従って、hadoopの単語数の例で実行してみまし

ファンではありませんが、Eclipse を使用してコードを実行しており、setMapper 関数のエラーが発生し続けています。

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;


import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;

import org.junit.Before;
import org.junit.Test;

public class TestWordCount {
  MapReduceDriver<LongWritable, Text, Text, IntWritable, Text, IntWritable> mapReduceDriver;
  MapDriver<LongWritable, Text, Text, IntWritable> mapDriver;
  ReduceDriver<Text, IntWritable, Text, IntWritable> reduceDriver;

  @Before
  public void setUp() throws IOException
  {
      WordCountMapper mapper = new WordCountMapper();
      mapDriver = new MapDriver<LongWritable, Text, Text, IntWritable>();
      mapDriver.setMapper(mapper);  //<--Issue here

      WordCountReducer reducer = new WordCountReducer();
      reduceDriver = new ReduceDriver<Text, IntWritable, Text, IntWritable>();
      reduceDriver.setReducer(reducer);

      mapReduceDriver = new MapReduceDriver<LongWritable, Text, Text, IntWritable,     Text, IntWritable>();
      mapReduceDriver.setMapper(mapper); //<--Issue here
      mapReduceDriver.setReducer(reducer);
  }

エラーメッセージ:

java.lang.Error: Unresolved compilation problems: 
    The method setMapper(Mapper<LongWritable,Text,Text,IntWritable>) in the type MapDriver<LongWritable,Text,Text,IntWritable> is not applicable for the arguments (WordCountMapper)
    The method setMapper(Mapper<LongWritable,Text,Text,IntWritable>) in the type MapReduceDriver<LongWritable,Text,Text,IntWritable,Text,IntWritable> is not applicable for the arguments (WordCountMapper)

この問題を調べると、API の競合である可能性があると思いますが、どこを探すべきかわかりません。他の誰かが以前にこの問題を抱えていますか?

編集Hadoop2 jar と最新の Junit(4.10) jar を含むユーザー定義ライブラリを使用しています。

EDIT 2 WordCountMapper のコードは次のとおりです

import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> 
{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();


    public void map(Object key, Text value, Context context)throws IOException, InterruptedException 
    {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) 
        {
            word.set(itr.nextToken());
            context.write(word, one);
        }
    }
}

最終編集 / IT WORKS

設定する必要があることがわかりました

WordCountMapper mapper = new WordCountMapper();

Mapper mapper = new WordCountMapper();

ジェネリックに問題があったからです。また、mockito ライブラリをユーザー定義ライブラリにインポートする必要がありました。

4

2 に答える 2

2

正しいクラスをインポートしたことを確認してください。上記とは異なり、プログラムが Reducer と reduce_test の両方のクラスに正しいパラメーターを持っていたのとは異なり、同じエラーに直面しましたが、間違ったクラスをインポートしたため、上記で報告された同じエラーメッセージに直面しました

間違ってインポートされたクラス--

org.apache.hadoop.mrunit.ReduceDriver をインポートします。

正しいクラス---

org.apache.hadoop.mrunit.mapreduce.ReduceDriver をインポートします。

パラメータがMapper__classとMapper_testで同じであることが確実な場合は、mapper_testの場合と同じソリューション

于 2015-12-06T10:20:42.413 に答える