MRUnit 으로 MultipleOutputs 를 사용하는 M/R 테스트 코드 작성하기
MRUnit 1.0.0 버전에서는 MultipleOutputs 를 사용한 M/R 코드를 테스할 수 있는 기능이 제공되지 않는다. 하지만 이와 관련된 이슈 MRUnit-13 를 살펴보면 기능 추가가 완료되었고, 다음 버전(1.1.0)에 추가되어 나올 것이라는 걸 알 수 있다.
하지만, 당장 Unit test 를 작성하고 검증하는데 이용해야 하는 상황이라면 개발 중인 버전을 받아 사용해볼 수 있다.
프로젝트 빌드 환경은 Mac OS X 10.9 Mavericks 이며, Maven 2 와 Java 7 을 이용한다.
Maven 2 설치 (Maven 3 으로는 빌드가 되지 않았음)
http://www.oracle.com/technetwork/java/javase/downloads/index.html
의존성을 가진 라이브러리 (Maven Repository)
hadoop-mapreduce-client-core 2.3.0
powermock-api-mockito 1.5.1
powermock-module-junit4 1.5.1
powermock-module-junit4-common 1.5.1
$ git clone http://git-wip-us.apache.org/repos/asf/mrunit.git
$ mvn package -Dhadoop.version=2 -Drat.numUnapprovedLic enses=128
빌드에 성공하면 target 디렉토리 밑에서 mrunit-1.2.0-SNAPSHOT-hadoop2.jar 파일을 찾을 수 있다. (버전 정보는 달라질 수 있음)
Unit test 를 작성할 때 mrunit/src/test 밑에 있는 코드를 참조한다. (MultipleOutputs 에 대한 테스트는 test/java/org/apache/hadoop/mrunit/mapreduce/TestMultipleOutput.java 참조)
@RunWith(PowerMockRunner.class) @PrepareForTest({MultipleOutputs.class, MyMap.class}) public class TestMyMap { private MapDriver<LongWritable, Text, Text, IntWritable> mapDriver; ... @Test public void testMyMapWithMultipleOutputs() throws Exception { mapDriver = MapDriver.newMapDriver(new MyMap()); mapDriver.withInput(new LongWritable(0), new Text("first")); mapDriver.withMultiOutput("OUT1", new Text("first"), new IntWritable(1)); mapDriver.runTest(); } ... }
@PrepareForTest() 안에 MultipleOutputs 클래스와 테스트하고자 하는 Mapper, Reducer 를 명시해둔다.
withMultiOutput() 메소드를 이용해 MultipleOutputs 로 출력하는 Mapper/Reducer 테스트 코드를 작성한다. 첫 번째 인자에는 NamedOutput 에 사용한 이름을 넘겨주고, 두 번째와 세 번째 인자에는 결과로 예상되는 Key/Value 를 넘겨준다.