mapper-reducer word count 實例

統計一個文件里各單詞的個數,假設這個文件很大。

原理如下圖:

編寫代碼:

WCMapper.java

package zengmg.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;/** public class WCMapper extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>{* 參數是4個泛型* KEYIN, VALUEIN,是mapper輸入數據的類型* KEYOUT, VALUEOUT,是mapper輸出數據的類型* map和reduce的數據輸入輸出都是以 key-value對的形式封裝的* 默認情況下,框架傳遞給mapper的輸入數據中,key是要處理的文本中一行的起始偏移量,這一行的內容作為value* mapper的輸出類型要結合業務,這里輸出 key是文本(String),value是個數(Long)* ps:* 輸入和輸出數據都要在網絡上傳遞,這些數據都要序列化,java自帶的序列化有太多的冗余內容,* 于是hadoop自定義了一套序列化。* 于是次數的java-Lang類型要用hadoop的LongWritable* java-String改為hadoop的Text*/
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{/** mapper拿到一行數據,就調一次這個方法*/@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)throws IOException, InterruptedException {//具體業務邏輯就寫在這個方法里//需要處理的業務邏輯數據,框架已經傳遞進來了,就是方法中的key和value//key是要處理的文本中一行的起始偏移量,這一行的內容作為value//業務邏輯://1、按空格分隔一行文本里的單詞//2、輸出 k 單詞,v 1String line=value.toString();String[] words=line.split(" ");for(String word:words){context.write(new Text(word), new LongWritable(1));}}}

WCReducer.java

package zengmg.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {// 框架在map處理完成之后,將map輸送過來的kv對緩存起來,進行分組,然后傳遞一個組<key,values{}>,//每個key一組,每組調用一次reduce方法進行統計// 舉例最后的kv對:<hello,{1,1,1,1,1,......}>,循環統計values就可以了@Overrideprotected void reduce(Text key, Iterable<LongWritable> values,Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {long count=0;for(LongWritable value:values){count+=value.get();}context.write(key, new LongWritable(count));}
}

WCRunner.java

package zengmg.hadoop.mr.wordcount;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;/** 用來描述一個特定的作業* 在hadoop集群里有很多作業job,需要指定這個業務邏輯作業使用哪個類作為邏輯處理的map,哪個作為reduce* 還可以指定該作業要處理的數據所在的路徑* 還可以指定該作業輸出的結果放到哪個路徑* .....* 該程序會打包成jar,放到hadoop的集群里跑*/
public class WCRunner {public static void main(String[] args) throws Exception {Configuration conf=new Configuration();Job wcJob= Job.getInstance(conf);//設置這個job所用的mapper類和reducer類所在的jar包//必須指定,在hadoop里會有很多的jar包作業wcJob.setJarByClass(WCRunner.class);//設置job使用的mapper類和reducer類wcJob.setMapperClass(WCMapper.class);wcJob.setReducerClass(WCReducer.class);/** 設置reducer輸出數據KV類型* 先設置reducer的原因是:沒有設置reducer輸出數據kv的類型的api,* setOutputKeyClass和setOutputValueClass會把reducer和mapper都設置了。* 如果reducer和mapper的輸出類型一樣,就用這條就夠了,無需setMapOutput...*/wcJob.setOutputKeyClass(Text.class);wcJob.setOutputValueClass(LongWritable.class);//設置mapper輸出數據kv類型//wcJob.setMapOutputKeyClass(Text.class);//wcJob.setMapOutputValueClass(LongWritable.class);//指定要處理的輸入數據存放路徑FileInputFormat.setInputPaths(wcJob, new Path("hdfs://hello110:9000/wc/srcdata/"));//指定處理結果的輸出數據存放路徑FileOutputFormat.setOutputPath(wcJob, new Path("hdfs://hello110:9000/wc/output/"));//將job提交給集群運行,true:打印運行日志wcJob.waitForCompletion(true);}
}

導出jar包,放到hadoop集群下運行。

1、啟動hadoop,start-all.sh

2、創建輸出文件

hadoop fs -mkdir /wc/srcdata/

3、編輯要統計的文件

vi word.log

4、上傳word.log到 hdfs的 /wc/srcdata ?文件夾下。

hadoop fs -put word.log /wc/srcdata

5、運行jar包

hadoop jar wcount.jar zengmg.hadoop.mr.wordcount.WCRunner

提示 successful,表明成功

6、進入輸出文件查看

?hadoop fs -ls /wc/output

?hadoop fs -cat /wc/output/part-r-00000


結果:

boy ? ? 1
girl ? ?1
hello ? 4
mimi ? ?1
world ? 1

按abc字母順序表排序的







本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539655.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 遠程調用url_使用Java的URL/HttpURLConnection進行遠程調用(POST請求)

利用Java的HttpURLConnection進行遠程url請求(調用遠程接口)測試類&#xff1a;請求類型為json,以post方式請求&#xff0c;利用OutputStream寫入數據實體類&#xff1a;public class User implementsSerializable {privateString name;privateString password;publicString ge…

LindDotNetCore~職責鏈模式的應用

回到目錄 職責鏈模式 它是一種設計模塊&#xff0c;主要將操作流程與具體操作解耦&#xff0c;讓每個操作都可以設置自己的操作流程&#xff0c;這對于工作流應用是一個不錯的選擇&#xff01; 下面是官方標準的定義&#xff1a;責任鏈模式是一種設計模式。在責任鏈模式里&…

MR程序的幾種提交運行模式

MR程序的幾種提交運行模式 本地模型運行 1/在windows的eclipse里面直接運行main方法&#xff0c;就會將job提交給本地執行器localjobrunner執行 ----配置path&#xff1a;D:\hadoop-2.7.2\bin ----配置hadoop_home&#xff1a;D:\hadoop-2.7.2 ----復制 hadoop.dll和winutil…

構件之法讀書筆記04

我們前兩周我們團隊一起制作了一個大學生記賬軟件&#xff0c;但是我們沒有對我們的軟件進行測試&#xff0c;只要是這個功能能夠順利進行&#xff0c;我們就覺得OK。 其實&#xff0c;我認為我們的軟件是有問題的&#xff0c;對于一些極限的操作能否完成&#xff0c;在各種環境…

零點起飛學java視頻_零點起飛學java (劉升華) 高清PDF_IT教程網

資源名稱&#xff1a;零點起飛學java (劉升華) 高清PDF第1篇 java開發基礎第1章 java概述( 教學視頻&#xff1a;37分鐘) 2第2章 基本數據類型及運算( 教學視頻&#xff1a;52分鐘) 14第3章 java程序流程控制( 教學視頻&#xff1a;33分鐘) 36第4章 類與對…

【Spark】開發Spark選擇Java還是Scala?

Spark-Java-Scala-哪種語言 spark java 支持_百度搜索(1 封私信)Spark 中用 Scala 和 java 開發有什么區別&#xff1f; - 知乎(1 封私信)Spark平臺下&#xff0c;scala比java更有優勢么&#xff1f; - 知乎

vector 修改 java_java對vector動態數組中的對象排序,以下代碼有何問題,如何修改?...

展開全部package com.tx.collection;import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;import java.util.Vector;public class Student {String name;int score;public S…

hadoop的序列化與java的序列化區別

java的序列化機制 java序列化時會把具體類的數據和類的繼承結構信息都序列化傳遞。如下圖hadoop的序列化機制 序列化類的數據&#xff0c;但是不序列化類的繼承結構信息。 網絡傳遞的時候就少了很多流量&#xff0c;hadoop也不需要類的繼承關系&#xff0c;只要類的數據就夠…

java mail 已發送_JavaMail獲取已發送郵件

public static voidmain(String args[]) {Properties props new Properties(); //參數配置props.setProperty("mail.transport.protocol", "smtp"); //使用的協議(JavaMail規范要求)props.setProperty("mail.smtp.host", "smtp.exmail.qq.c…

ORA-08103: object no longer exists

今天工具箱報錯&#xff1a; ORA-08103: object no longer exists 查了原因&#xff0c;是有session在操作表&#xff0c;比如插入&#xff0c;更新等。而工具箱這個操作剛好在select表&#xff0c;所以報錯。-------下文是英文解釋----- ORA-08103: object no longer exists錯…

【Spark】Spark-空RDD判斷與處理

Spark-空RDD判斷與處理 SparkKafkaDemo - Streaming Statisticsrdd isempty count_百度搜索Spark RDD.isEmpty costs much time - Stack OverflowSpark Streaming中空RDD的處理-Spark-about云開發[SPARK-5270] Provide isEmpty() function in RDD API - ASF JIRA19 Spark Stre…

JDBC開發步驟

JDBC開發步驟&#xff1a; 1、加載數據庫驅動 2、通過DriverManager獲取數據庫連接Connection 3、通過Connection獲取Statement/PreparedStatement 4、將SQL語句綁定到Statement/PreparedStatement中去&#xff0c;準備向數據庫發送SQL語句 5、執行完sql語句后&#xff0c…

DAY3-“忙里偷閑”找你玩耍2018-1-11

接觸Java第三天&#xff0c;嘿嘿&#xff0c;今天近代史期末考試&#xff0c;提前一小時交卷&#xff0c;回宿舍繼續學習&#xff0c;中午去見女神姐姐了&#xff0c;每次見完女神姐姐都是滿滿地動力。這次女神姐姐告訴我們要好好規劃自己的時間&#xff0c;早上花20分鐘規劃好…

java 數據保存內存_java中的各種數據類型在內存中存儲的方式 一

1.java是如何管理內存的java的內存管理就是對象的分配和釋放問題。(其中包括兩部分)分配&#xff1a;內存的分配是由程序完成的&#xff0c;程序員需要通過關鍵字new為每個對象申請內存空間(基本類型除外)&#xff0c;所有的對象都在堆(Heap)中分配空間。釋放&#xff1a;對象的…

Gradle學習之構建java與web項目

一.使用Gradle的java插件構建Java項目 1&#xff09;Gradle插件包含了若干個接口定義和已有的任務項&#xff0c;語法結構&#xff1a;apply plugin:插件名 ,此處我們定義插件 apply plugin : java 2&#xff09;Gradle希望我們的java項目需要遵循以下規范&#xff1a; src/mai…

Hibernate單表開發步驟

Hibernate單邊開發步驟&#xff1a; 1、創建Configuration&#xff0c;加載src/hibernate.cfg.xml配置文件&#xff0c;該配置文件中又去加載Hello.hbm.xml映射文件。 2、通過Configuration創建重量級SessionFactory。重量級&#xff1a;創建慢&#xff0c;內存占用大&#…

基于ssm出租車管理系統的設計與實現論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本出租車管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息&…

redission java_Java注解如何基于Redission實現分布式鎖

這篇文章主要介紹了Java注解如何基于Redission實現分布式鎖,文中通過示例代碼介紹的非常詳細&#xff0c;對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下1、定義注解類Target({ ElementType.METHOD })Retention(RetentionPolicy.RUNTIME)Documentedpublic i…

Spring Security源碼分析四:Spring Social實現微信社交登錄

2019獨角獸企業重金招聘Python工程師標準>>> 社交登錄又稱作社會化登錄&#xff08;Social Login&#xff09;&#xff0c;是指網站的用戶可以使用騰訊QQ、人人網、開心網、新浪微博、搜狐微博、騰訊微博、淘寶、豆瓣、MSN、Google等社會化媒體賬號登錄該網站。 前言…

jdbc開發優缺點

1&#xff09;優點&#xff1a;簡單易學,上手快,非常靈活構建SQL&#xff0c;效率高 2&#xff09;缺點&#xff1a;代碼繁瑣&#xff0c;難以寫出高質量的代碼&#xff08;例如&#xff1a;資源的釋放&#xff0c;SQL注入安全性等&#xff09; 開發者既要寫業務邏輯&#xff0…