日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

mrunit_使用MRUnit测试Hadoop程序

發(fā)布時(shí)間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mrunit_使用MRUnit测试Hadoop程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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
  • mrunit-0.9.0-incubating-hadoop2.jar
  • 我敢肯定,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è)試,您將:

  • 實(shí)例化完全與被測(cè)映射器參數(shù)化的MapDriver類(lèi)的實(shí)例。
  • 在withMapper調(diào)用中添加要測(cè)試的Mapper實(shí)例。
  • 在withInput調(diào)用中,輸入您的鍵和輸入值,在這種情況下,一個(gè)LongWritable具有任意值和一個(gè)Text對(duì)象,其中包含來(lái)自NCDC天氣數(shù)據(jù)集的行,該數(shù)據(jù)集包含在名為“ temps”的字符串?dāng)?shù)組中,該數(shù)組早先在2000年建立。測(cè)試(此處不會(huì)顯示,因?yàn)樗鼤?huì)脫離演示文稿)。
  • 在withOutput調(diào)用中指定期望的輸出,在這里我們期望一個(gè)Text對(duì)象的值為“ 190101”,一個(gè)TemperatureAveragingPair對(duì)象的值為-61(溫度)和1(計(jì)數(shù))。
  • 最后一個(gè)調(diào)用runTest將指定的輸入值輸入到映射器中,并將實(shí)際輸出與“ withOutput”方法中設(shè)置的預(yù)期輸出進(jìn)行比較。
  • 需要注意的一件事是,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();}
  • 該測(cè)試首先創(chuàng)建一個(gè)TemperatureAveragingPair對(duì)象列表,以用作減速器的輸入。
  • 實(shí)例化了ReducerDriver,并且與MapperDriver一樣,對(duì)它的參數(shù)設(shè)置也與被測(cè)試的reducer完全一樣。
  • 接下來(lái),我們傳遞要在withReducer調(diào)用中測(cè)試的reducer實(shí)例。
  • 在withInput調(diào)用中,我們傳入鍵“ 190101”和在測(cè)試開(kāi)始時(shí)創(chuàng)建的pairList對(duì)象。
  • 接下來(lái),我們指定我們期望減速器發(fā)出的輸出,相同的鍵“ 190101”和一個(gè)IntWritable,它表示列表中的溫度平均值。
  • 最終調(diào)用runTest,它將為我們的減速器提供指定的輸入,并將減速器的輸出與期望輸出進(jìn)行比較。
  • 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è)試策略:

  • 單元測(cè)試映射/減少代碼。
  • 可能使用MapReduceDriver類(lèi)編寫(xiě)一個(gè)集成測(cè)試。
  • 作為一個(gè)健全性檢查,請(qǐng)?jiān)趩喂?jié)點(diǎn)安裝(在我的筆記本電腦上)上運(yùn)行MapReduce作業(yè),以確保其在Hadoop框架上運(yùn)行。
  • 然后,在我的案例中,使用Apache Whirr在EC2的測(cè)試集群上運(yùn)行我的代碼。
  • 討論如何在筆記本電腦(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。