MRUnit(MapReduce用のテストライブラリ)を試す

昨日のHadoopソースリーディング4回目(Hadoopソースコードリーディングまとめ第4回 #hadoopreading)で、
@okachimachiorz1 さんが、MRUnit便利だし使うよね的な事をおっしゃっていて、
どんなもんかなと思ってチョロっと自動テストしてみました。

【環境】
 1. EclipseのMapReduceプラグイン
  hadoop-0.20.2-eclipse-plugin.jar(Hadoopをインストールしたところのcontribに入ってる)を
  eclipseのプラグインディレクトリに突っ込んで再起動すると
  ウィザードでMap/Reduce Projectが作れるようになります。
  ⇒ Hadoopのインストールディレクトリを指定するとそこにパス通してくれる感じ。
 
 2. JUnit4のjarを落としてパスを通す
  HadoopのlibにはJUnit3.8しか入ってなかったので。
  MRUnitのページみたら @Before とかJUnit4のアノテーションが前提みたいになってました。
 
 3. MRUnitのjarを落としてパスを通す
  ググったら↓に置いてありました。
  https://repository.cloudera.com/index.html#nexus-search;classname~MRUnit
  コレ、maven使ってれば依存関係の定義をpom.xmlに入れてやるだけでイケそうですね~
 
 
【実装】
 使い方は↓こんな感じのようなので、、、
 http://www.slideshare.net/emwendelin/testing-hadoop-jobs-with-mrunit
 http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/
 
 ↓こんな感じのMapperに、、
========
public class HogeMapper extends MapReduceBase implements Mapper {
  private Text word = new Text();
  @Override
  public void map(Object key, Object value, OutputCollector output,
      Reporter reporter) throws IOException {
    // TODO Auto-generated method stub
    String line = value.toString();
    StringTokenizer st = new StringTokenizer(line, ",");
    while (st.hasMoreTokens()) {
      word.set(st.nextToken());
      output.collect(word, new IntWritable(1));
    }
  }
}

========
 
 ↓こんな感じのテストしてみました。
========
public class HogeTest extends TestCase {
  private Mapper mapper;
  private MapDriver driver; ←こいつがMRUnitのオブジェクト
  @Before
  public void setUp() {
    mapper = new HogeMapper();
    driver = new MapDriver(mapper);
  }
  @Test
  public void testHogeMapper() {
    driver.withInput(new Text("foo"), new Text("aar,kar,sar,tar,aar"));
    driver.withOutput(new Text("aar"), new IntWritable(1));
    driver.withOutput(new Text("kar"), new IntWritable(1));
    driver.withOutput(new Text("sar"), new IntWritable(1));
    driver.withOutput(new Text("tar"), new IntWritable(1));
    driver.withOutput(new Text("aar"), new IntWritable(1));
    driver.runTest();
  }
}

========
 
インプットのファイルを用意しなくていいから楽チンって感じですかねぇ~

コメント

タイトルとURLをコピーしました