1. 程式人生 > >hadoop單元測試方法--使用和增強MRUnit[1]

hadoop單元測試方法--使用和增強MRUnit[1]

hadoop單元測試方法--使用和增強MRUnit

1前言

hadoopmapreduce提交到叢集環境中出問題的定位是比較麻煩的,有時需要一遍遍的修改程式碼和打出日誌來排查一個很小的問題,如果資料量大的話除錯起來相當耗時間。因此有必要使用良好的單元測試手段來儘早的消除明顯的bug(當然僅有單元測試是不夠的,畢竟跟叢集的執行環境還是不一樣的)。

然而做mapreduce的單元測試會有一些障礙,比如MapReduce一些引數物件是在執行時由hadoop框架傳入的,例如OutputCollectorReporter等。這就需要有Mock手段。最初寫mapreduce單元測試的時候自己寫了幾個簡單的

Mock也基本能滿足需要,後來發現MRUnit比我寫的要好用所以研究了一下就採用了。MRUnit是專門為hadoop mapreduce寫的單元測試框架,API簡潔明瞭,簡單實用。但也有一些薄弱的地方,比如不支援MultipleOutputs(很多情況下我們會用MultipleOutputs作為多檔案輸出,後面將介紹如何增強MRUnit使之支援MultipleOutputs)。

2 MRUnit

MRUnit針對不同測試物件分別使用以下幾種Driver

lMapDriver,針對單獨的Map測試。

lReduceDriver,針對單獨的Reduce測試。

lMapReduceDriver,將

MapReduce連貫起來測試。

lPipelineMapReduceDriver,將多個Map-Reduce pair貫串測試。

MapDriver

單獨測試Map的例子,假設我們要計算一個賣家的平均發貨速度。Map將蒐集每一次發貨的時間間隔。針對Map的測試,

//這是被測試的Map

private Map mapper;

private MapDriver<LongWritable, Text, Text, TimeInfo> mapDriver;

@Before

publicvoid setUp() {

mapper = new Map();

mapDriver = new MapDriver<LongWritable, Text, Text, TimeInfo>();

}

@Test

publicvoid testMap_timeFormat2() {

String sellerId = "444";

//模擬輸入一行(withInput),假設從這行資料中我們可以獲得賣家(sellerId)//某一次時間間隔10小時.

//我們期望它輸出sellerIdkeyvalue為代表110小時的TimeInfo物件。//withOutput

//如果輸入資料經過Map計算後為期望的結果,那麼測試通過。

Text mapInputValue = new Text("……");

mapDriver.withMapper(mapper)

.withInput(null, mapInputValue)

.withOutput(new Text(sellerId), new TimeInfo(1, 10))

.runTest();

}

ReduceDriver

針對Reduce的單獨測試,還是這個例子。Reduce為根據MapCombiner輸出的n次時間間隔的總和來計算平均時間。

private Reduce reducer;

@Before

publicvoid setUp() {

reducer = new Reduce();

reduceDriver = new ReduceDriver<Text, TimeInfo, Text, LongWritable>(reducer);

}

@Test

publicvoid testReduce () {

List<TimeInfo> values = new ArrayList<TimeInfo>();

values.add(new TimeInfo(1, 3));//一次3小時

values.add(new TimeInfo(2, 5));//兩次總共5小時

values.add(new TimeInfo(3, 7));//三次總共7小時

//values作為444這個賣家的reduce輸入,

//期望計算出平均為2小時

reduceDriver.withReducer(reducer)

.withInput(new Text("444"), values)

.withOutput(new Text("444"),new LongWritable(2))

.runTest();

}

MapReduceDriver

以下為MapReduce聯合測試的例子,

private MapReduceDriver<LongWritable, Text, Text, TimeInfo, Text, LongWritable> mrDriver;

private Map mapper;

private Reduce reducer;

@Before

publicvoid setUp() {

mapper = new Map();

reducer = new Reduce();

mrDriver = new MapReduceDriver<LongWritable, Text, Text, TimeInfo, Text, LongWritable>(mapper, reducer);

}

@Test

publicvoid testMapReduce_3record_1user() {

Text mapInputValue1 = new Text("……");

Text mapInputValue2 = new Text("……");

Text mapInputValue3 = new Text("……");

//我們期望從以上三條Map輸入計算後,

//reduce輸出得到444這個賣家的平均時間為2小時.

mrDriver.withInput(null, mapInputValue1)

.withInput(null, mapInputValue2)

.withInput(null, mapInputValue3)

.withOutput(new Text("444"),new LongWritable(2))

.runTest();

}

相關推薦

hadoop單元測試方法--使用增強MRUnit[1]

hadoop單元測試方法--使用和增強MRUnit 1前言 hadoop的mapreduce提交到叢集環境中出問題的定位是比較麻煩的,有時需要一遍遍的修改程式碼和打出日誌來排查一個很小的問題,如果資料量大的話除錯起來相當耗時間。因此有必要使用良好的單元測試手段來儘

python unittest單元測試方法用例

python內部自帶了一個單元測試的模組,pyUnit也就是我們說的:unittest 先介紹下unittest的基本使用方法: 1.import unittest 2.定義一個繼承自unittest.TestCase的測試用例類 3.定義setUp和tearDown,在

VS2015 c++程序單元測試初探——從0到1中所遇到的錯誤歷程

ima 資料 因此 開頭 完成 數字 style debug unit 實現過程 一開始對單元測試這個東西感覺很恐懼,在看過雪晴的博客後,覺得自己可以試試學學,找到了一篇博客,地址: VS2015安裝與C++進行簡單單元測試 前面的建立和初始化都比較easy,但很快遇到了一

Java基礎 @org.junit.Test-單元測試方法 + 操縱CollectionMap的工具類 : Collections 的sort/binarySearch/max/min等靜態方法

單元測試程式碼:   ( 在IDEA中先輸入'@Test '然後根據提示進行自動修訂即可!!執行時直接執行即可!         若有多個單元測試塊的時候,直接把滑鼠放在哪裡就自動在哪裡執行那個單元塊) import java.util.*; /**操縱Collection和Map

[Hadoop]Hadoop單元測試MRUnit

在MapReduce中,map函式和reduce函式的獨立測試是非常方便的,這是由函式風格決定的 。MRUnit是一個測試庫,它便於將已知的輸入傳遞給mapper或者檢查reducer的輸出是否符合預期。MRUnit與標準的執行框架(JUnit)一起使用。1. 設定開發環境m

太白---落燕紛飛第一重 Android單元測試Instrumentationirobotium

tom 先來 otto 重現 size sim 個人 思想 pack PS:叫太白---落燕紛飛純粹好玩(天涯明月遊戲畫面感,打擊感,碰撞盡管做的不盡人意,可是太白這個職業還是不錯,用作開頭,,做個旁白而已)。 這裏的單元測試不管是instrumenta

《軟件測試方法技術》-讀書筆記(一)

圖片 軟件工程 AI 開發 支持 ont 3年 發的 一次 軟件測試正反兩方面的爭辯 軟件測試領域先驅 Bill Hetzel 博士 1993年在美國的北卡羅來納大學組織了歷史上第一次正式的關於軟件測試的會議。從此以後,軟件測試開始頻繁出現在軟件工程的研究和實踐中,也可以認

單元測試方法以及實例

testing reat 測試用例 request uri 異常 .data author 為什麽 為什麽要測試? Web程序開發過程一般包括以下幾個階段:[需求分析,設計階段,實現階段,測試階段]。其中測試階段通過人工或自動來運行測試某個系統的功能。目的是檢驗其是否滿足需

【Android】單元測試方法簡介

前言 基本單元測試框架 Java單元測試框架:Junit、Mockito、Powermockito等; Android單元測試框架:Robolectric、AndroidJUnitRunner、Espresso等。 最開始建議先學習Junit & Mockito。

【轉】關於java 單元測試Junit4Mock的一些總結

原文出處請點選這裡 1. 單元測試的必要性 最近專案有在寫java程式碼的單元測試,然後在思考一個問題,為什麼要寫單元測試??單元測試寫了有什麼用??百度了一圈,如下: 軟體質量最簡單、最有效的保證; 是目的碼最清晰、最有效的文件;

上傳NUnit的單元測試結果OpenCover的單元測試覆蓋率到SonarQube服務中

SonarQube.Scanner.MSBuild.exe begin /k:"OMDCCQuotes" /d:sonar.host.url="http://myip:9000" /d:sonar.login="mykey" /d:sonar.cs.nunit.reportsPaths="%CD%\Te

功能性測試方法流程

方法:(常用) 1.功能分解 2.等價類劃分 3.邊界值分析 4.因果圖法 一、功能分解:通過功能分解可以明確軟體功能性測試的內容,使軟體功能性測試可度量,有利於測試監督和管理 二、等價類劃分:將程式的輸入或輸出域的不同區間或分為不同的資料類,以便匯出測試用例 有效等價類:

Jacoco單元測試配置使用

最近專案在重構。對未來的規劃就是測試驅動開發。 先寫單元測試,再開發程式碼。以單元測試的結果來判斷程式碼實現的可用性。 因為大批量的補充之前的程式碼的單元測試,是一件產出大於收入的事情。 所以目前是在日常的需求周迭代中,補充了每次改動部分的單元測試。 為了客觀展示單元測試補充情況,決

單元測試--JunitMockito

說到測試,大家都不會陌生,從我們開始學習程式設計開始,就知道測試。測試和程式設計就像兩個雙胞胎似的,可是,顯然我們更鐘情於雙胞胎中的一個--程式設計。一些人可能對測試瞭然於胸,卻匱乏於行動,一些人也可能對測試只是聞其名不知其意。下面這篇博文就是給大家在零基礎上講解一下Java中單元測試的使用。 -----

對web專案的單元測試方法

1 HttpClient模擬請求,需要開啟伺服器 /* Map<String,String> param = new HashMap<String,String>(); param.put("businesstype", "1006"); para

【SpringBoot】整合JPA啟動基於JPA的單元測試方法報如下錯誤:could not initialize proxy

出現該錯誤,分析了一下原因:基於JPA的實現來說,在進行資料庫訪問的時候,針對資料庫的訪問與操作session已經關閉釋放了。 百度了一下,網上有如下解決方案: 第一種方案:在@OneToMany的引數中使用fetch=FetchType=Eager 未涉及到該註解的使

java測試方法程式碼的執行時間

long a=System.currentTimeMillis(); /** * 內容 */ System.out.println("\r<br

C#的單元測試方法

一、         單元測試 是軟體測試方法的其中一種,其中還有比如動態黑盒測試、資料測試、破壞性測試等等。 單元測試也稱之為“模組測試”,是對程式設計中的最小單元——函式進行測試的一種方法,所謂測

java使用jUnit,jMockit,dbunit做DAO層單元測試方法

第一步:準備資料 先在MySQL資料庫中填寫測試資料和期望資料,然後匯出到xml檔案中。 全表匯出:DBUnitHelper.exportTable("t_dp_content_02001", TEST_DATA_FILE); 條件查詢匯出:DBUnitHelper

溫故而知新:gtest單元測試工具lcov覆蓋率統計工具的結合使用

一、簡介        之所以叫溫故而知新,是因為將這兩個工具結合起來作為單元測試工具的想法在上一個專案中應用了,好像還沒有人將這兩種工具結合使用,或者沒有寫成部落格供大家參考,現在重新溫習下將想法寫下來。     gtest單元測試工具接觸過的人都很熟悉了,它是一款go