您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 >
使用MRUnit實(shí)現(xiàn)MapReduce程序的單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/4/3 14:05:25 ] 推薦標(biāo)簽:

Hadoop的MapReduce程序的測(cè)試,一直比較麻煩。因?yàn)椴环奖愠槿〕鰜,作為?dú)立的Junit測(cè)試。所以很多時(shí)候,我們都是寫一個(gè)Main函數(shù),

然后在里面手工調(diào)用Map或者Reduce,用System.out.println打印出結(jié)果,人眼測(cè)試,而且還要判斷OutputCollector是否為空,不然直接

Main調(diào)用還會(huì)拋NullPointerException。
這樣大的弊端,是無法實(shí)現(xiàn)自動(dòng)化的斷言判斷,達(dá)到測(cè)試驅(qū)動(dòng)和檢查的目的。那么對(duì)程序的任何改動(dòng),都需要放到Hadoop集群上,跑個(gè)十

幾分鐘才能肯定到底對(duì)不對(duì)。我們需要一個(gè)更快的方法,能夠方便的自動(dòng)化的對(duì)MR程序進(jìn)行測(cè)試,從而達(dá)到測(cè)試驅(qū)動(dòng)和敏捷開發(fā)的狀態(tài)。
What’s MRUnit:
MRUnit是由Couldera公司開發(fā)的專門針對(duì)Hadoop中編寫MapReduce單元測(cè)試的框架,基本原理是JUnit4和EasyMock。MR是Map和Reduce的縮

寫。MRUnit框架非常精簡(jiǎn),其核心的單元測(cè)試依賴于JUnit。而且MRUnit實(shí)現(xiàn)了一套Mock對(duì)象來控制OutputCollector的操作,從而可以攔截

OutputCollector的輸出,和我們的期望結(jié)果進(jìn)行比較,達(dá)到自動(dòng)斷言的目的。
Why MRUnit:
有了MRUnit,對(duì)MR程序做重構(gòu)的時(shí)候,只要明確輸入和輸出,可以寫出單元測(cè)試,并且在放到群集校驗(yàn)前進(jìn)行試驗(yàn),從而節(jié)省時(shí)間和資源

,也能更快的定位到問題。
而進(jìn)行重構(gòu)的話,只要寫得足夠詳細(xì)的單元測(cè)試都是綠色的話,那么基本可以保證在群集運(yùn)行的結(jié)果也是正常的。
How MRUnit:
MRUnit不在Apache標(biāo)準(zhǔn)的Hadoop的發(fā)行版中,而是在Couldera公司的增強(qiáng)版本中hadoop-0.20.1+133.tar.gz的contribmrunithadoop-

0.20.1+169.56-mrunit.jar,已經(jīng)貼在附件中。只要把它和Junit4的jar添加到Hadoop程序項(xiàng)目的classpath中,可以使用MRUnit了。
MRUnit包含四種Driver:MapDriver,ReduceDriver,MapReduceDriver,PipelineMapReduceDriver。可以根據(jù)自己的需要選擇合適的

Driver。
MRUnit Example:

給出一個(gè)Reduce的很簡(jiǎn)單例子,Reduce的邏輯是把Value中的各個(gè)值相加。

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();
}

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd