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