Hadoop的MapReduce程序的測試,一直比較麻煩。因為不方便抽取出來,作為獨立的Junit測試。所以很多時候,我們都是寫一個Main函數,
然后在里面手工調用Map或者Reduce,用System.out.println打印出結果,人眼測試,而且還要判斷OutputCollector是否為空,不然直接
Main調用還會拋NullPointerException。
這樣大的弊端,是無法實現自動化的斷言判斷,達到測試驅動和檢查的目的。那么對程序的任何改動,都需要放到Hadoop集群上,跑個十
幾分鐘才能肯定到底對不對。我們需要一個更快的方法,能夠方便的自動化的對MR程序進行測試,從而達到測試驅動和敏捷開發的狀態。
What’s MRUnit:
MRUnit是由Couldera公司開發的專門針對Hadoop中編寫MapReduce單元測試的框架,基本原理是JUnit4和EasyMock。MR是Map和Reduce的縮
寫。MRUnit框架非常精簡,其核心的單元測試依賴于JUnit。而且MRUnit實現了一套Mock對象來控制OutputCollector的操作,從而可以攔截
OutputCollector的輸出,和我們的期望結果進行比較,達到自動斷言的目的。
Why MRUnit:
有了MRUnit,對MR程序做重構的時候,只要明確輸入和輸出,可以寫出單元測試,并且在放到群集校驗前進行試驗,從而節省時間和資源
,也能更快的定位到問題。
而進行重構的話,只要寫得足夠詳細的單元測試都是綠色的話,那么基本可以保證在群集運行的結果也是正常的。
How MRUnit:
MRUnit不在Apache標準的Hadoop的發行版中,而是在Couldera公司的增強版本中hadoop-0.20.1+133.tar.gz的contribmrunithadoop-
0.20.1+169.56-mrunit.jar,已經貼在附件中。只要把它和Junit4的jar添加到Hadoop程序項目的classpath中,可以使用MRUnit了。
MRUnit包含四種Driver:MapDriver,ReduceDriver,MapReduceDriver,PipelineMapReduceDriver。可以根據自己的需要選擇合適的
Driver。
MRUnit Example:
給出一個Reduce的很簡單例子,Reduce的邏輯是把Value中的各個值相加。
public class ExtractKeywordTest {
private Reducer<Text, Text, Text, Text> reducer;
private ReduceDriver<Text, Text, Text, Text> reduceDriver;
@Before
public void setUp() throws Exception {
reducer = new ExtractKeywordAcookie.Reduce();
reduceDriver = new ReduceDriver<Text, Text, Text, Text>(reducer);
}
@Test
public void testReduce() {
List<Text> values = new ArrayList<Text>();
values.add(new Text(1.0_0.1));
values.add(new Text(2.0_0.2));
values.add(new Text(3.0_0.3));
reduceDriver.withInput(new Text(20100106_00_IBM), values)
.withOutput(new Text(20100106_00_IBM_6.00_0.60_), null)
.runTest();
}