1. 程式人生 > >MapReduce程式除錯工具--MRUnit簡介與使用

MapReduce程式除錯工具--MRUnit簡介與使用

MRUnit簡介:

        當hadoop的MapReduce作業提交到叢集環境中執行,對於出問題的定位比較是比較麻煩的,有時需要一遍遍的修改程式碼和打印出日誌來排查一個很小的問題,如果資料量大的話除錯起來相當耗時間。因此有必要使用良好的單元測試手段來儘早的消除明顯的bug。然而做MapReduce的單元測試會有一個障礙,比如Map和Reduce一些引數物件是在執行時由hadoop框架傳入的,例如OutputCollector、Reporter、InputSplit等。這就需要有其他手段去完成。MRUnit是專門為Hadoop MapReduce寫的單元測試框架,API簡單明瞭,簡單實用。但也有一些薄弱的地方,比如不支援MultibleOutputs(很多情況下我們會用MultipleOutputs作為多檔案輸出,後面將介紹如何加強MRUnit使之支援MultipleOutputs)。

MRUnit安裝:

       對於在已有Hadoop工程專案中使用MUnit需要遵循如下步驟:

(1)首先下載MRUnit,網址為http://mrunit.apache.org/,下載最新的MRUnit。本人使用的hadoop版本為hadoop 1.0.4 下載的檔案為 apache-mrunit-1.0.0-hadoop1-bin.tar.gz

(2)解壓縮下載的檔案,得到hamcrest-core-1.1.jar  junit-4.10.jar  mockito-all-1.8.5.jar  mrunit-1.0.0-hadoop1.jar

(3)將這四個檔案加入到專案的Path中。在eclipse中,選中專案-->右鍵build path-->configure build path-->add external jars。

MRUnit例項:

       我們知道,在進行一般性的JUnit測試時,根據不同的測試物件要採用不同的測試模組來進行,MRUnit針對不同測試物件分別使用一下幾種Driver:  MapDriver ,針對單獨的Map測試 ReduceDriver,針對單獨的Reduce測試。 MapReduceDriver ,將Map和Reduce連貫起來測試。 PipelineMapReduceDriver,將多個Map-Reduce pair貫穿測試。 下面我們首先來看使用MRUnit對自定義的Mapper進行測試的方法。

下面使用經典入門程式worldcount舉例,體驗下MRUnit的效果。

Map程式:

package com.hadoop;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class TxtMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
     protected void map(LongWritable key, Text value, Context context) throws java.io.IOException ,InterruptedException {
    String []strs=value.toString().split(" ");
    for(String str:strs){
    context.write(new Text(str), new IntWritable(1));
    }
     };
}

Reduce程式:

package com.hadoop;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class TxtReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws java.io.IOException ,InterruptedException {
    int sum=0;
    Iterator<IntWritable>it=values.iterator();
    while(it.hasNext()){
    IntWritable value=it.next();
    sum+=value.get();
    }
    context.write(key, new IntWritable(sum));
    };
}

測試程式:

package com.hadoop;


import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.junit.Before;
import org.junit.Test;


public class MapTest{
private Mapper Map;
private MapDriver driver;
@Before
public void init(){
Map=new TxtMapper();
driver=new MapDriver(Map);
}
@SuppressWarnings("unchecked")
@Test
public void testMap()throws Exception{
String text="hello world goodbye world hello hadoop goodbye hadoop";
driver.withInput(new LongWritable(), new Text(text))
.withOutput(new Text("hello"),new IntWritable(1))
.withOutput(new Text("world"),new IntWritable(1))
.withOutput(new Text("goodbye"),new IntWritable(1))
.withOutput(new Text("world"),new IntWritable(1))
.withOutput(new Text("hello"),new IntWritable(1))
.withOutput(new Text("hadoop"),new IntWritable(1))
.withOutput(new Text("goodbye"),new IntWritable(1))
.withOutput(new Text("hadoop"),new IntWritable(2)).runTest();
}

}

選中方法 run as junit test,結果進度條為綠色,證明junit測試正確。


如果將.最後一行寫為 withOutput(new Text("hadoop"),new IntWritable(2)).runTest(),則出現下面的錯誤結果:

13/09/26 15:58:16 ERROR mrunit.TestDriver: Received unexpected output (hadoop, 1) at position 7.
13/09/26 15:58:16 ERROR mrunit.TestDriver: Missing expected output (hadoop, 2) at position 7.

可見MRUnit已經生效。


也可以參考MRUnit官網上的示例:

Following is an example to use MRUnit to unit test a Map Reduce program that does SMS CDR (call details record) analysis.

The records look like

  1. CDRID;CDRType;Phone1;Phone2;SMS Status Code
    655209;1;796764372490213;804422938115889;6
    353415;0;356857119806206;287572231184798;4
    835699;1;252280313968413;889717902341635;0

The MapReduce program analyzes these records, finds all records with CDRType as 1, and note its corresponding SMS Status Code. For example, the Mapper outputs are

6, 1
0, 1

The Reducer takes these as inputs and output number of times a particular status code has been obtained in the CDR records.

The corresponding Mapper and Reducer are

publicclassSMSCDRMapper extendsMapper<LongWritable, Text, Text, IntWritable> { privateText status = newText(); privatefinalstatic IntWritable addOne = newIntWritable(1); /** * Returns the SMS status code and its count */ protectedvoidmap(LongWritable key, Text value, Context context) throwsjava.io.IOException, InterruptedException { //655209;1;796764372490213;804422938115889;6 is the Sample record format String[] line = value.toString().split(";"); // If record is of SMS CDR if(Integer.parseInt(line[1]) == 1) { status.set(line[4]); context.write(status, addOne); } } }

The corresponding Reducer code is

publicclassSMSCDRReducer extends Reducer<Text, IntWritable, Text, IntWritable> { protectedvoidreduce(Text key, Iterable<IntWritable> values, Context context) throwsjava.io.IOException, InterruptedException { intsum = 0; for(IntWritable value : values) { sum += value.get(); } context.write(key,newIntWritable(sum));

相關推薦

MapReduce程式除錯工具--MRUnit簡介使用

MRUnit簡介:         當hadoop的MapReduce作業提交到叢集環境中執行,對於出問題的定位比較是比較麻煩的,有時需要一遍遍的修改程式碼和打印出日誌來排查一個很小的問題,如果資料量大的話除錯起來相當耗時間。因此有必要使用良好的單元測試手段來儘早的消除

GDB程式除錯工具

使用gcc/g++編譯程式時加-g選項以方便除錯。 設定系統允許產生core檔案: $ulimit -c unlimited 除錯由test程式產生的core檔案: $gdb ./test core 設定輸出資訊時的分頁功能 set pagination on # 或者 set heigh

arm-linux-gdb除錯工具的安裝交叉編譯gdbserver

arm-linux-gdb除錯工具的安裝與交叉編譯gdbserver 分類:嵌入式 開發環境:LPC3250 開發板:安裝linux2.6.39; 交叉編譯工具:arm-none-linux-gnueabi-gcc pc的虛擬機器:Linux version 2.6.32.

核心除錯神器SystemTap — 簡介使用(一)

a linux trace/probe tool. 簡介 SystemTap是我目前所知的最強大的核心除錯工具,有些傢伙甚至說它無所不能:) (1) 發展歷程 Debuted in 2005 in Red Hat Enterprise Linux 4 Update

arm-linux-gdb & gdbserver 遠端除錯工具的搭建使用

     由於嵌入式系統資源有限性,一般不能直接在ARM上進行除錯,通常採用arm-linux-gdb+gdbserver的方式進行遠端除錯。Target端(ARM)使用 Gdbserver,host端(PC主機)使用arm-linux-gdb,雙方最好統一編譯工具鏈。在應用

godebug:一個跨平臺的Go程式除錯工具

godebug是一個跨平臺的Go程式除錯工具,傳統的編譯型語言偵錯程式使用底層系統呼叫並讀取二進位制檔案用於除錯各類符號。使用起來很麻煩而且很難移植。 godebug使用不同的方法,直接把原始碼作為目標程式,在每一行插入除錯程式碼,然後編譯並執行。結果就是一個全功能的偵

MapReduce 單元測試工具 MRUnit 使用

MRUnit的使用很簡單,流程如下: 1:根據業務要求編寫Map類,Reduce類 2:編寫測試類。 3:執行測試,得到結果。 準備測試資料: CDRID;CDRTyp

ubuntu 下串列埠除錯工具 minicom安裝配置

      如果專案中使用的bootloader為 u-boot,那麼在用minicom向目標板傳送kernel時 會發生一些錯誤。故若您使用的是u-boot,建議您使用kermit,關於kermit的安裝和配置 使用請參考這篇文章:     儘管與u-boot的組合中

微信小程式小白總結全攻略2-學習路線相關資源和除錯工具

廢話都在前一章講了,這裡直接切入正題。 下面以我自己的微信小程式全棧學習路線(淺嘗輒止式的),按照時間順序往下依次列出,並附上對應的除錯工具和方法、學習資源以及我的評價 一、前端部分 (一)HTML(超文字標記語言:HyperText Markup Language) 除錯工具:

【C程式編譯連結】gcc使用命令介紹 gcc的使用簡介命令列引數說明

1.gcc或者g++安裝rpm -qa|grep gcc ==>檢查gcc是否安裝gcc -v ==>檢查gcc版本 編譯器會在可執行檔案中植入一些資訊,可執行檔案會變大。一般開發時候使用 -g ,編譯一個 “release 版本” 時不使用 -g 編譯。gcc如果是最新的則不重

《wiki官網教程》 4 視覺化除錯工具

一、儲存和回放資料 1、錄製資料(通過建立一個bag檔案) 記錄ROS系統執行時的話題資料,記錄的話題資料將會累積儲存到bag檔案中。 1、Terminal 1: $ roscore Terminal 2: $ rosrun turtlesim turtlesim_node

微信小程式的開發準備及其除錯工具

一、微信小程式  微信公眾平臺    https://mp.weixin.qq.com/cgi-bin/wx 二、下載開發工具  https://developers.weixin.qq.com/miniprogram/dev/de

MRunit 測試MapReduce 程式

使用MRunit 測試 MapReduce ,就比如我們寫java 程式是的junit單元測試,其實,mrunit 和標準的junit框架一起使用,可以將mapreduce作業的測試作為正常開發環境的一部分執行。 準備測試的包:mrunit-1.1.0-hadoop2.jar ,下載地址

Vue開發除錯工具--除錯工具

主要講三個東西: Vue.js devtools開發工具的使用 使用debugger和sourcemap除錯Vue元件 vscode中除錯Vue元件 Vue.js devtools開發工具的使用

C++學習筆記(2)——程式的建立、編譯除錯

單位新來的同事(也是非科班出生)問我程式設計用什麼軟體時,我大多會告訴他們VS2010或者VS2008(原諒我們單位用的IDE還如此老舊)。他們便會找來VS2010或者VS2008的教程,一步步照著做起來。新建工程,寫了一個main函式,列印了“helloworld”,點選了

Redis Lua程式設計除錯工具使用

前言 Redis自2.6.0版本開始內建Lua直譯器。 Lua,輕量級指令碼語言,號稱最快的指令碼語言。 兩者結合將爆發出巨大的威力。 簡介 Redis Lua指令碼可以呼叫原生的Redis命令,也可以包含自定義的控制流、邏輯運算、數學運算等,將複雜的業務邏輯封

Mybatis(一)Mybatis簡介入門程式

Mybatis簡介:   MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼。   Mybatis

Unix下C程式記憶體洩漏檢測工具Valgrind安裝使用

                Valgrind是一款用於記憶體除錯、記憶體洩漏檢測以及效能分析的軟體開發工具。 Valgrind的最初作者是Julian Seward,他於2006年由於在開發Valgrind上的工作獲得了第二屆Google-O'Reilly開原始碼獎。 Valgrind遵守GNU通用公共許

程式藍芽除錯工具上線啦!

一、微信小程式開發相關資料: 微信公眾平臺: 開發小程式或公眾號需要先到這裡註冊 小程式官方文件: 微信小程式開發離不了官方文件。 小程式官方開發文件: 微信小程式開發離不了官方開發文件。 二、主要效果圖 三、簡述 1.藍芽BLE除錯工具

.NET應用程式除錯:原理、工具、方法

閱讀目錄: 1.背景介紹 2.基本原理(Windows除錯工具箱、.NET除錯擴充套件SOS.DLL、SOSEX.DLL) 2.1.Windows除錯工具箱 2.2..NET除錯擴充套件包,SOS.DLL、SOSEX.DLL 2.3.除錯系統的基本流程及架構(.NETDAC概念、mscordacwks.