1. 程式人生 > >MapReduce程式設計例項(一)

MapReduce程式設計例項(一)

前提準備:

MapReduce程式設計例項:


開發示例:WordCount

本文例詳細的介紹如何在整合環境中執行第一個MapReduce程式 WordCount,以及WordCount程式碼分析

新建MapReduce專案:

 

Finish生成專案如下,建立WordCount.java類

WordCount.java類程式碼以下詳細解,先執行起來。

在HDFS建立新目錄並上傳若干實驗用的文字,上傳後如下:


配置Run Configuration 引數:

hdfs://localhost:9000/user/dat/input hdfs://localhost:9000/user/dat/output

Run On Hadoop,


OK,執行成功,檢查HDFS的檔案生成


Eclipse中可以直接檢視也可以在命令列中檢視結果


OK,第一個MapReduce程式 WordCount已經成功執行。下面開始解析程式碼部分

----------------------------------------------煩人的分割線-----------------------------------------------------

程式碼:

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;


public class WordCount {
	
	//巢狀類 Mapper
	//Mapper<keyin,valuein,keyout,valueout>
	public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{
		private final static IntWritable one = new IntWritable(1);
		private Text word = new Text();
		
		@Override
		protected void map(Object key, Text value, Context context)
				throws IOException, InterruptedException {
			StringTokenizer itr = new StringTokenizer(value.toString());
			while(itr.hasMoreTokens()){
				word.set(itr.nextToken());
				context.write(word, one);//Context機制
			}
		}
	}
	
	
	//巢狀類Reducer
	//Reduce<keyin,valuein,keyout,valueout>
	//Reducer的valuein型別要和Mapper的va lueout型別一致,Reducer的valuein是Mapper的valueout經過shuffle之後的值
	public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		private IntWritable result = new IntWritable();

		@Override
		protected void reduce(Text key, Iterable<IntWritable> values,
				Context context)
				throws IOException, InterruptedException {
			int sum  = 0;
			for(IntWritable i:values){
				sum += i.get();
			}
			result.set(sum);
			context.write(key,result);//Context機制
		}

		
		
	}
	
	public static void main(String[] args) throws Exception{
		Configuration conf = new Configuration();//獲得Configuration配置 Configuration: core-default.xml, core-site.xml
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();//獲得輸入引數 [hdfs://localhost:9000/user/dat/input, hdfs://localhost:9000/user/dat/output]
		if(otherArgs.length != 2){//判斷輸入引數個數,不為兩個異常退出
			System.err.println("Usage:wordcount <in> <out>");
			System.exit(2);
		}
		
		////設定Job屬性
		Job job = new Job(conf,"word count");
		job.setJarByClass(WordCount.class);
		job.setMapperClass(WordCountMapper.class);
		job.setCombinerClass(WordCountReducer.class);//將結果進行區域性合併
		job.setReducerClass(WordCountReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//傳入input path
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//傳入output path,輸出路徑應該為空,否則報錯org.apache.hadoop.mapred.FileAlreadyExistsException。
		
		System.exit(job.waitForCompletion(true)?0:1);//是否正常退出
	}
	
}


先解釋兩個Java基礎問題

----------------------------------StringTokener類--------------------------------------------------------------

Java語言中,提供了專門用來分析字串的類StringTokenizer(位於java.util包中)。該類可以將字串分解為獨立使用的單詞,並稱之為語言符號。語言符號之間由定界符(delim)或者是空格、製表符、換行符等典型的空白字元來分隔。其他的字元也同樣可以設定為定界符。StringTokenizer類的構造方法及描述見表15-6所示。

表15-6                                          StringTokenizer類的構造方法及描述

構 造 方 法

描    述

StringTokenizer(String str)

為字串str構造一個字串分析器。使用預設的定界符,即空格符(如果有多個連續的空格符,則看作是一個)、換行符、回車符、Tab符號等

StringTokenizer(String str, String delim)

為字串str構造一個字串分析器,並使用字串delim作為定界符

StringTokenizer類的主要方法及功能見表15-7所示。

表15-7                                          StringTokenizer類的主要方法及功能

方    法

功    能

String nextToken()

用於逐個獲取字串中的語言符號(單詞)

boolean hasMoreTokens()

用於判斷所要分析的字串中,是否還有語言符號,如果有則返回true,反之返回false

int countTokens()

用於得到所要分析的字串中,一共含有多少個語言符號

下面是一個例子。

String s1 = "|ln|ln/sy|ln/dl|ln/as|ln/bx|";
StringTokenizer stringtokenizer1 = new StringTokenizer(s1, "|");

while(stringtokenizer1 .hasMoreTokens()) {

 String s3 = stringtokenizer.nextToken();
 System.out.println(s3);
}

輸出:
ln
ln/sy
ln/dl
ln/as
ln/bx

-------------------------------------------Java 靜態內部類 內部類-----------------------------------------------

-------------------------------------------Java的反射機制--------------------------------------------------------

----------------------------------------WordCount MapReduce程式碼分析-------------------------------------

程式碼分為三部分,一個主函式,一個巢狀類WordCountMapper繼承Mapper,一個巢狀類WordCountReducer繼承Reducer。

主函式通過反射設定Job屬性,設定輸入輸出路徑.。

WordCountMapper:

一個常量IntWritable做valueout,一個Text做keyout.

重寫map方法,用StringTokener解析字串,寫入context

WordCountReducer:

一個Intwritable變數,記錄輸出個數。

reduce函式解析values計算數量,設定context的keyout,valueout。

ok,就是這麼easy。。。

注意map和reduce都是回撥函式,是由MapReduce框架控制的,還未深入研究。

相關推薦

MapReduce程式設計例項

前提準備: MapReduce程式設計例項: 開發示例:WordCount 本文例詳細的介紹如何在整合環境中執行第一個MapReduce程式 WordCount,以及WordCount程式碼分析 新建MapReduce專案:   Finish生成

Python學習初級程式設計例項

題目:有1、2、3、4四個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去 掉不滿足條件的排列。 程式原始碼

MapReduce程式設計例項

package com.t.hadoop; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import

MapReduce程式設計例項

前提準備: MapReduce程式設計例項: 輸入: 2013-11-01 aa 2013-11-02 bb 2013-11-03 cc 2013-11-04 aa 2013-11-05 dd 2013-11-06 dd 2013-11-07

CPU卡程式設計例項電路

1. 硬體電路 1.1. 電路框圖 關於CPU卡的基礎知識及檔案機制,請參閱相關文件,這裡不再贅述。 CPU卡一般與ESAM模組(嵌入式安全控制模組)配合使用,CPU卡的作用就不多說了。ESAM模組一般與微控制器一起焊接在電路板上。ESAM模組其實可以看做固定在電路

hadoop之mapreduce程式設計例項系統日誌初步清洗過濾處理

剛剛開始接觸hadoop的時候,總覺得必須要先安裝hadoop叢集才能開始學習MR程式設計,其實並不用這樣,當然如果你有條件有機器那最好是自己安裝配置一個hadoop叢集,這樣你會更容易理解其工作原理。我們今天就是要給大家演示如何不用安裝hadoop直接除錯程式設計MapR

ios程式設計初識

1、用vmware虛擬機器搭建開發環境 vmware版本:12.1.1 專業版 vmware mac os補丁:http://download.csdn.net/download/yu1441/9654941(先關閉vmware,再以管理員許可權執行win-instal

Linux學習之shell 程式設計基礎

一、linux中經常和正則表示式聯合使用的工具 grep sed awk(自己去研究吧). 二,以grep為例,有以下正則操作 特殊符號彙總 特殊符號 代表意義 [:alnum:] 代表英文

Python GUI程式設計 Tkinter

Tkinter 是Python內建的一個 頁面程式設計的一個庫。 一、匯入tkinter from tkinter import * 二、頁面程式設計首先需要建立一個視窗 # 將tkinter 物件例項化 root = Tk() # 設定視窗標題 root.title('視窗標題

hadoop程式設計實踐

Hadoop操作基礎與IDE環境配置。 Hadoop操作 目錄操作 在操作之前,需要在hadoop根目錄下建立與Linux使用者同名的user目錄 ./bin/hdfs dfs -mkdir -p /user/hadoop 之後,所有的檔案都預設放

verilog例項

幾個經典的簡單例程 一、 /*四選一多路選擇器 */  module MUX41a(a,b,c,d,s1,s0,y);  input a,b,c,d;  input s0,s1;  output y;    reg y;//變數有

Linux命令列與shell指令碼程式設計大全

一、基本 bash shell命令 建立檔案 : touch 連結檔案:符號連結:是一個實實在在的檔案,兩個通過符號連結在一起的檔案,彼此的內容並不相同。使用ln -s命令。 硬連結:會建立獨立的虛擬檔案,其中包含了原始檔案的資訊及位置。但他們從根本上而言是同一個檔案。原始檔案必須事

Python Scrapy 爬蟲框架例項

之前有介紹 scrapy 的相關知識,但是沒有介紹相關例項,在這裡做個小例,供大家參考學習。 注:後續不強調python 版本,預設即為python3.x。 爬取目標 這裡簡單找一個圖片網站,獲取圖片的先關資訊。 該網站網址: http://www.58pic.com/c/ 建立專案 終端命令列執

極光推送 使用例項 服務端

                原文:http://blog.csdn.net/u014733374/article/detail

scrapy爬蟲框架簡單入門例項

scrapy是一個用於爬取網站資料,提取結構性資料的python應用框架。爬取的資料一般用於資料分析,資料處理,儲存歷史資料等。scrapy的整體架構大致如下: 主要包括了以下元件: 引擎(Scrapy) 用來處理整個系統的資料流, 觸發事務(框架核心) 排程器(

響應式程式設計系列:什麼是響應式程式設計?reactor入門

響應式程式設計 系列文章目錄 (一)什麼是響應式程式設計?reactor入門 (二)Flux入門學習:流的概念,特性和基本操作 (三)Flux深入學習:流的高階特性和進階用法 (四)reactor-core響應式api如何測試和除錯? (五)Spring reactive: Spring WebFl

演算法題十八:搜狗19年校招程式設計——找區間

注:筆試時並沒有AC,線下修改後可以輸出示例結果。 問題:從一個序列中找出所有包含全部數字的最小索引區間,若有多個則按出現的順序輸出。 輸入輸出示例: 輸入:1 1 3 4 6 6 5 1 1 3 3 輸出:[2,7] [3,8] [4,9] 分析:先用一個list

javaScript面向物件程式設計-繼承

類有三部分 建構函式內的,供例項化物件複製用的 建構函式外的,直接通過點語法新增的,供類使用,例項化物件訪問不到 類的原型中的,例項化物件可以通過其原型鏈間接地訪問到,也是供所有例項化物件所共用的。 類式繼承 類的原型物件的作用就是為類的原型新增共有方法,但類不

Java 複雜 XML轉Object 物件例項

Java 複雜 XML轉Object 物件例項:         在實際工作當中與第三方介面互動報文很多情況下都是XML格式,會用一些開源的解析XML對映Object物件工具類.很多時候網上找的開源框架工具類可能存在一些不相容現有系統.因此通過dom4j單個解析xml工作繁

TCP/IP網路程式設計學習

前言:學校開的課比價不合理,這學期才剛剛接觸計算機網路,可是本學期很多課卻又是以計算機網路為基礎的。沒辦法,只能先自己學習一些計算機網路方面的知識。學習這個網路程式設計主要是為了做我的一個程式設計的實驗