mrunit_使用MRUnit测试Hadoop程序
mrunit
這篇文章將略微繞開(kāi)使用MapReduce實(shí)現(xiàn)數(shù)據(jù)密集型處理中發(fā)現(xiàn)的模式,以討論同樣重要的測(cè)試。 湯姆?惠勒 ( Tom Wheeler)在紐約2012年Strata / Hadoop World會(huì)議上參加的一次演講給了我部分啟發(fā)。 當(dāng)處理大型數(shù)據(jù)集時(shí),想到的并不是單元測(cè)試。 但是,當(dāng)考慮到無(wú)論集群有多大或有多少數(shù)據(jù)時(shí),都將相同的代碼推送到所有節(jié)點(diǎn)以運(yùn)行MapReduce作業(yè),因此Hadoop映射器和化簡(jiǎn)器非常適合進(jìn)行單元測(cè)試。 但是,對(duì)框架進(jìn)行Hadoop的單元測(cè)試并不容易。 幸運(yùn)的是,有一個(gè)使Hadoop測(cè)試相當(dāng)容易的庫(kù)– MRUnit 。 MRUnit基于JUnit并允許對(duì)映射器,化簡(jiǎn)器進(jìn)行單元測(cè)試以及對(duì)映射器進(jìn)行一些有限的集成測(cè)試-歸化器與組合器,自定義計(jì)數(shù)器和分區(qū)器之間的交互。 在撰寫(xiě)本文時(shí),我們正在使用最新版本的MRUnit 0.9.0。 所有測(cè)試的代碼均來(lái)自上一則有關(guān)使用本地聚合計(jì)算平均值的文章 。建立
要開(kāi)始使用,請(qǐng)從此處下載MRUnit。 解壓縮tar文件后,將cd插入mrunit-0.9.0-incubating / lib目錄。 在其中,您應(yīng)該看到以下內(nèi)容:
我敢肯定,mrunit-0.9.0-incubating-hadoop1.jar用于Hadoop的MapReduce版本1,mrunit-0.9.0-incubating-hadoop2.jar用于處理Hadoop的新版本的MapReduce。 對(duì)于本文以及其他所有后續(xù)文章,我們將使用Cloudera CDH4.1.1發(fā)行版中的hadoop-2.0版本,因此我們需要mrunit-0.9.0-incubating-hadoop2.jar文件。 我在Intellij中將MRUnit,JUnit和Mockito添加為庫(kù)(JUnit和Mockito與MRUnit jar文件位于同一目錄中)。 現(xiàn)在我們已經(jīng)建立了依賴(lài)關(guān)系,讓我們開(kāi)始測(cè)試。
測(cè)試映射器
設(shè)置測(cè)試映射器非常簡(jiǎn)單,最好先查看一些代碼來(lái)說(shuō)明。 我們將使用上一篇文章中的映射器內(nèi)合并示例:
@Test public void testCombiningMapper() throws Exception {new MapDriver<LongWritable,Text,Text,TemperatureAveragingPair>().withMapper(new AverageTemperatureCombiningMapper()).withInput(new LongWritable(4),new Text(temps[3])).withOutput(new Text('190101'),new TemperatureAveragingPair(-61,1)).runTest();}注意流利的api樣式,這增加了創(chuàng)建測(cè)試的難度。 要編寫(xiě)測(cè)試,您將:
需要注意的一件事是,MapDriver每次測(cè)試僅允許一個(gè)輸入和輸出。 您可以根據(jù)需要多次調(diào)用withInput和withOutput,但是MapDriver會(huì)用新值覆蓋現(xiàn)有值,因此您將只能在任何時(shí)間使用一個(gè)輸入/輸出進(jìn)行測(cè)試。 要指定多個(gè)輸入,我們將使用MapReduceDriver,稍后將介紹幾節(jié),但接下來(lái)將測(cè)試化簡(jiǎn)器。
測(cè)試減速器
測(cè)試減速器遵循與映射器測(cè)試相同的模式。 再次,讓我們開(kāi)始看一個(gè)代碼示例:
@Test public void testReducerCold(){List<TemperatureAveragingPair> pairList = new ArrayList<TemperatureAveragingPair>();pairList.add(new TemperatureAveragingPair(-78,1));pairList.add(new TemperatureAveragingPair(-84,1));pairList.add(new TemperatureAveragingPair(-28,1));pairList.add(new TemperatureAveragingPair(-56,1));new ReduceDriver<Text,TemperatureAveragingPair,Text,IntWritable>().withReducer(new AverageTemperatureReducer()).withInput(new Text('190101'), pairList).withOutput(new Text('190101'),new IntWritable(-61)).runTest();}ReducerDriver具有與MapperDriver相同的限制,即不接受多個(gè)輸入/輸出對(duì)。 到目前為止,我們已經(jīng)單獨(dú)測(cè)試了Mapper和Reducer,但我們也想在集成測(cè)試中一起測(cè)試它們。 可以通過(guò)使用MapReduceDriver類(lèi)來(lái)完成集成測(cè)試。 MapReduceDriver還是用于測(cè)試組合器,自定義計(jì)數(shù)器或自定義分區(qū)程序使用情況的類(lèi)。
整合測(cè)試
為了測(cè)試您的mapper和reducer一起工作,MRUnit提供了MapReduceDriver類(lèi)。 如您現(xiàn)在所期望的,MapReduceDriver類(lèi)有兩個(gè)主要區(qū)別。 首先,參數(shù)化映射器的輸入和輸出類(lèi)型以及化簡(jiǎn)器的輸入和輸出類(lèi)型。 由于映射器輸出類(lèi)型需要與化簡(jiǎn)器輸入類(lèi)型匹配,因此最終需要3對(duì)參數(shù)化類(lèi)型。 其次,您可以提供多個(gè)輸入并指定多個(gè)預(yù)期輸出。 這是我們的示例代碼:
@Test public void testMapReduce(){new MapReduceDriver<LongWritable,Text,Text,TemperatureAveragingPair,Text,IntWritable>().withMapper(new AverageTemperatureMapper()).withInput(new LongWritable(1),new Text(temps[0])).withInput(new LongWritable(2),new Text(temps[1])).withInput(new LongWritable(3),new Text(temps[2])).withInput(new LongWritable(4),new Text(temps[3])).withInput(new LongWritable(5),new Text(temps[6])).withInput(new LongWritable(6),new Text(temps[7])).withInput(new LongWritable(7),new Text(temps[8])).withInput(new LongWritable(8),new Text(temps[9])).withCombiner(new AverageTemperatureCombiner()).withReducer(new AverageTemperatureReducer()).withOutput(new Text('190101'),new IntWritable(-22)).withOutput(new Text('190102'),new IntWritable(-40)).runTest();}從上面的示例中可以看到,設(shè)置與MapDriver和ReduceDriver類(lèi)相同。 您傳入映射器,reducer和(可選)組合器的實(shí)例進(jìn)行測(cè)試。 MapReduceDriver允許我們傳遞具有不同鍵的多個(gè)輸入。 此處的“臨時(shí)”數(shù)組與在映射器示例中引用的數(shù)組相同,并包含來(lái)自NCDC天氣數(shù)據(jù)集的幾行,而這些示例行中的鍵是1901年1月和2月的月份,分別表示為“ 190101”和“ 190102“。 該測(cè)試是成功的,因此我們對(duì)映射器和化簡(jiǎn)器一起工作的正確性有了更多的信心。
結(jié)論
希望我們已經(jīng)證明了MRUnit對(duì)于測(cè)試Hadoop程序有多么有用。 我想用我自己的一些觀點(diǎn)來(lái)總結(jié)這篇文章。 盡管MRUnit使映射器和化簡(jiǎn)器代碼的單元測(cè)試變得容易,但是這里介紹的映射器和化簡(jiǎn)器示例相當(dāng)簡(jiǎn)單。 如果您的映射和/或精簡(jiǎn)代碼開(kāi)始變得更加復(fù)雜,則最好將代碼與Hadoop框架解耦,然后單獨(dú)測(cè)試新類(lèi)。 另外,與MapReduceDriver類(lèi)一樣,它對(duì)于集成測(cè)試非常有用,很容易達(dá)到不再測(cè)試代碼,而已經(jīng)測(cè)試Hadoop框架本身的地步。 我提出了自己打算繼續(xù)使用的測(cè)試策略:
討論如何在筆記本電腦(OSX Lion)上設(shè)置單節(jié)點(diǎn)安裝以及如何使用Whirr在EC2上建立群集將使這篇文章過(guò)長(zhǎng),因此我將在下一篇文章中介紹這些主題。 謝謝你的時(shí)間。
資源資源
- Jimmy Lin和Chris Dyer 使用MapReduce進(jìn)行的數(shù)據(jù)密集型處理
- Hadoop: Tom White 的權(quán)威指南
- 來(lái)自博客的源代碼
- Hadoop API
- MRUnit用于單元測(cè)試Apache Hadoop映射減少工作
- Gutenberg項(xiàng)目提供了大量純文本格式的書(shū)籍,非常適合在本地測(cè)試Hadoop作業(yè)。
參考: 《 隨機(jī)編碼》博客上的JCG合作伙伴 Bill Bejeck的《 使用MRUnit測(cè)試Hadoop程序》 。
翻譯自: https://www.javacodegeeks.com/2012/11/testing-hadoop-programs-with-mrunit.html
mrunit
總結(jié)
以上是生活随笔為你收集整理的mrunit_使用MRUnit测试Hadoop程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 备案制和正式编制的区别(备案制和正式编制
- 下一篇: 实际的Reactor操作–检索Cloud