在Hadoop中使用MRUnit進行單元測試
在Hadoop中使用MRUnit進行單元測試
前提
1. 瞭解JUnit4.x的使用。2. 瞭解Mock的概念在單元測試中的應用。
3. 瞭解Hadoop中MapReduce的程式設計模型。
如果您對Junit和Mock不瞭解,可以先閱讀[翻譯]Unit testing with JUnit 4.x and EasyMock in Eclipse - Tutorial。
如果您對Hadoop中MapReduce的程式設計模型不瞭解,可以先閱讀。
介紹
MRUnit是一款由Couldera公司開發的專門針對Hadoop中編寫MapReduce單元測試的框架。
它可以用於0.18.x版本中的經典org.apache.hadoop.mapred.*的模型,也能在0.20.x版本org.apache.hadoop.mapreduce.*的新模型中使用。
官方的介紹如下:
MRUnit is a unit test library designed to facilitate easy integration between your MapReduce development process and standard development and testing tools such as JUnit. MRUnit contains mock objects that behave like classes you interact with during MapReduce execution (e.g., InputSplit and OutputCollector) as well as test harness "drivers" that test your program's correctness while maintaining compliance with the MapReduce semantics. Mapper and Reducer implementations can be tested individually, as well as together to form a full MapReduce job.
安裝
在目前Hadoop的發行版中,並沒有預設包含MRUnit。你需要去Couldera公司的官網中去下載一個由他們再次發行的版本。
推薦的版本為:。
下載這個檔案後,你將在hadoop-0.20.1+133\contrib\mrunit目錄中找到我們需要的jar包:hadoop-0.20.1+133-mrunit.jar。
為了使用MRUnit,我們需要將hadoop-0.20.1+133-mrunit.jar和Junit4.x使用的jar包:junit.jar都新增到我們開發Hadoop程式專案的classpath中。
示例
程式碼是最好的文件,我們先看一個簡單的map單元測試示例,程式碼如下:
package gpcuster.cnblogs.com; import junit.framework.TestCase; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.lib.IdentityMapper; import org.junit.Before; import org.junit.Test; import org.apache.hadoop.mrunit.MapDriver; public class TestExample extends TestCase { private Mappermapper; private MapDriver driver; @Before public void setUp() { mapper = new IdentityMapper (); driver = new MapDriver (mapper); } @Test public void testIdentityMapper() { driver.withInput(new Text("foo"), new Text("bar")) .withOutput(new Text("foo"), new Text("bar")) .runTest(); } }
在這段示例程式碼中,我們使用的map是org.apache.hadoop.mapred.lib.IdentityMapper。這是一個非常簡單的map函式:輸入什麼,就輸出什麼。
org.apache.hadoop.mrunit.MapDriver是我們從MRUnit框架中匯入的一個專門用於測試map的類。
我們透過withInput指定輸入的引數,透過withOutput指定我們期望的輸出,然後透過runTest執行我們的測試。
功能
1. 測試Map,我們可以使用MapDriver。2. 測試Reduce,我們可以使用ReduceDriver。
3. 測試一個完整的MapReduce,我們可以使用MapReduceDriver。
4. 測試多個MapReduce組合而成的操作,我們可以使用PipelineMapReduceDriver。
實現
MRUnit框架非常精簡,其核心的單元測試依賴於JUnit。
由於我們編寫的MapReduce函式中包含有一個OutputCollector的物件,所以MRUnit自己實現了一套Mock物件來控制OutputCollector的操作。
侷限
透過閱讀MRUnit的原始碼我們會發現:
1. 不支援MapReduce框架中的分割槽和排序操作:從Map輸出的值經過shuffle處理後直接就匯入Reduce中了。2. 不支援Streaming實現的MapReduce操作。
雖然MRUnit有這些侷限,但是足以完成大多數的需求。
參考資料
本文地址:部落格園 逖靖寒 http://gpcuster.cnblogs.com
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1220344/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在C#中進行單元測試C#
- 使用JUnit進行單元測試
- 使用jest進行單元測試
- Python中的單元測試框架:使用unittest進行有效測試Python框架
- 使用Jest進行React單元測試React
- 如何使用MOQ進行單元測試
- 使用 Spring Boot 進行單元測試Spring Boot
- Mock 在 Python 單元測試中的使用MockPython
- 使用Angular CLI進行單元測試和E2E測試Angular
- Jest & enzyme 進行react單元測試React
- 如何對Spring MVC中的Controller進行單元測試SpringMVCController
- 單元測試:單元測試中的mockMock
- 首次在WebAPI中寫單元測試WebAPI
- [譯]對 React 元件進行單元測試React元件
- 使用SAP CRM mock框架進行單元測試的設計Mock框架
- 使用FakeAsync對Angular非同步程式碼進行單元測試Angular非同步
- JavaScript 測試教程-part 1:用 Jest 進行單元測試JavaScript
- 單元測試在Unity中的應用Unity
- 使用karma和jasmine配合phantom瀏覽器進行單元測試ASM瀏覽器
- FastAPI(43)- 基於 pytest + requests 進行單元測試ASTAPI
- .net持續整合單元測試篇之單元測試簡介以及在visual studio中配置Nunit使用環境
- Flutter測試(二):在專案中進行 Widget 測試Flutter
- 使用 PyHamcrest 執行健壯的單元測試REST
- 使用Github Copilot生成單元測試並執行Github
- go 單元測試進階篇Go
- 在TypeScript專案中進行BDD測試TypeScript
- 如果利用 python 對 java 程式碼進行 單元測試?PythonJava
- Springboot整合JUnit5優雅進行單元測試Spring Boot
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 單元測試工具 TestNG 使用
- java中的單元測試Java
- 使用python對oracle進行簡單效能測試PythonOracle
- 使用CountDownLatch或迴圈屏障對多執行緒程式碼進行單元測試 -XebiaCountDownLatch執行緒
- 在Rainbond上使用Locust進行壓力測試AI
- 前端進階課程之單元測試前端
- Golang 學習——基於 Gin 框架進行 httptest 單元測試Golang框架HTTP
- 測試開發之單元測試-禪道結合ZTF驅動單元測試執行
- Cmocka 單元測試配置與使用Mock
- 如何執行指定的單元測試