關于MapReduce單詞統計的例子:

要統計的文件的文件名為hello

hello中的內容如下

hello  you

hello  me

通過MapReduce程序統計出文件中的各個單詞出現了幾次.(兩個單詞之間通過tab鍵進行的分割)

復制代碼
  1 import java.io.IOException;
  2 
  3 import mapreduce.WordCountApp.WordCountMapper.WordCountReducer;
  4 
  5 import org.apache.hadoop.conf.Configuration;
  6 import org.apache.hadoop.fs.Path;
  7 import org.apache.hadoop.io.LongWritable;
  8 import org.apache.hadoop.io.Text;
  9 import org.apache.hadoop.mapreduce.Job;
 10 import org.apache.hadoop.mapreduce.Mapper;
 11 import org.apache.hadoop.mapreduce.Reducer;
 12 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 13 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 14 
 15 /**
 16  * 以文本
 17  * hello    you
 18  * hello    me
 19  * 為例子.
 20  * map方法調用了兩次,因為有兩行
 21  * k2 v2 鍵值對的數量有幾個?
 22  * 有4個.有四個單詞.
 23  * 
 24  * 會產生幾個分組?
 25  * 產生3個分組.
 26  * 有3個不同的單詞.
 27  *
 28  */
 29 public class WordCountApp {
 30     public static void main(String[] args) throws Exception {
 31         //程序在這里運行,要有驅動.
 32         Configuration conf = new Configuration();
 33         Job job = Job.getInstance(conf,WordCountApp.class.getSimpleName());
 34         
 35         //我們運行此程序通過運行jar包來執行.一定要有這句話.
 36         job.setJarByClass(WordCountApp.class);
 37         
 38         FileInputFormat.setInputPaths(job,args[0]);
 39         
 40         job.setMapperClass(WordCountMapper.class);//設置Map類
 41         job.setMapOutputKeyClass(Text.class);//設置Map的key
 42         job.setMapOutputValueClass(LongWritable.class);//設置Map的value
 43         job.setReducerClass(WordCountReducer.class);//設置Reduce的類
 44         job.setOutputKeyClass(Text.class);//設置Reduce的key Reduce這個地方只有輸出的參數可以設置. 方法名字也沒有Reduce關鍵字區別于Map
 45         job.setOutputValueClass(LongWritable.class);//設置Reduce的value.
 46         
 47         FileOutputFormat.setOutputPath(job, new Path(args[1]));
 48         job.waitForCompletion(true);//表示結束了才退出,不結束不退出
 49     }
 50     /**
 51      * 4個泛型的意識
 52      * 第一個是LongWritable,固定就是這個類型,表示每一行單詞的起始位置(單位是字節)
 53      * 第二個是Text,表示每一行的文本內容.
 54      * 第三個是Text,表示單詞
 55      * 第四個是LongWritable,表示單詞的出現次數
 56      */
 57     public static class WordCountMapper extends Mapper<LongWritable, Text, Text    ,LongWritable>{
 58         Text k2 = new Text();
 59         LongWritable v2 = new LongWritable();
 60         //增加一個計數器,這個Map調用幾次就輸出對應的次數.
 61         int counter = 0;
 62         
 63         
 64         /**
 65          * key和value表示輸入的信息
 66          * 每一行文本調用一次map函數
 67          */
 68         @Override
 69         protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, LongWritable>.Context context)    
 70                 throws IOException, InterruptedException {
 71             counter  = counter + 1;
 72             System.out.println("mapper 調用的次數:" + counter);
 73             //這個map方法中的Mapper的各個泛型和上面的意識是一樣的,分別代表的是k1,v1,k2,v2
 74             String line = value.toString();
 75             System.out.println(String.format("<k1,v1>的值<"+key.get()+","+line+">"));
 76             String[] splited = line.split("\t");
 77             for (String word : splited) {
 78                 k2.set(word);
 79                 v2.set(1);
 80                 System.out.println(String.format("<k2,v2>的值<"+k2.toString()+","+v2.get()+">"));
 81                 context.write(k2, v2);//通過context對象寫出去.
 82             }
 83         }
 84         /**
 85          * 這個地方的四個泛型的意思
 86          * 前兩個泛型是對應的Map方法的后兩個泛型.
 87          * Map的輸出對應的是Reduce的輸入.
 88          * 第一個Text是單詞
 89          * 第二個LongWritable是單詞對應的次數
 90          * 我們想輸出的也是單詞 和 次數
 91          * 所以第三個和第四個的類型和第一和第二個的一樣
 92          * 
 93          * 分組指的是把相同key2的value2放到一個集合中
 94          *
 95          */
 96         public static class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
 97             LongWritable v3 = new LongWritable();
 98             //增加一個計數器,這個Reduce調用幾次就輸出對應的次數.
 99             int counter = 0;
100             
101             /**
102              * 每一個分組調用一次reduce函數
103              * 過來的k2 分別是hello you me
104              * 
105              */
106             @Override
107             protected void reduce(Text key2, Iterable<LongWritable> value2Iterable,Reducer<Text, LongWritable, Text, 
108                     LongWritable>.Context context)
109                             throws IOException, InterruptedException {
110                 counter  = counter + 1;
111                 System.out.println("reducer 調用的次數:" + counter);
112                 //第一個參數是單詞,第二個是可迭代的集合. 為什么上面的LongWritable類型的對象value2變成了一個可以迭代的結合參數?
113                 //因為分組指的是把相同key2的value2放到一個集合中
114                 long sum = 0L;
115                 for (LongWritable value2 : value2Iterable) {
116                     System.out.println(String.format("<k2,v2>的值<"+key2.toString()+","+value2.toString()+">"));
117                     sum += value2.get(); //這個value2是LongWritable類型的,不能進行+= 操作,要用get()得到其對應的java基本類型.
118                     //sum表示單詞k2 在整個文本中的出現次數.
119                 }
120                 v3.set(sum);
121                 context.write(key2, v3);
122                 System.out.println(String.format("<k3,v3>的值<"+key2.toString()+","+v3.get()+">"));
123             }
124         }
125     }
126 }
復制代碼

?

通過運行Yarn集群查看Map日志得到的輸出結果:?

查看Reduce日志產看到的輸出結果:

?

//============================================================================

以下程序是之前的寫的:注釋更加詳細:

復制代碼
  1 /*
  2  * 一個hello文件內容如下:
  3  *   hello        you
  4  *   hello        me
  5  */
  6 import java.io.IOException;
  7 
  8 import org.apache.hadoop.conf.Configuration;
  9 import org.apache.hadoop.fs.Path;
 10 import org.apache.hadoop.io.LongWritable;
 11 import org.apache.hadoop.io.Text;
 12 import org.apache.hadoop.mapreduce.Job;
 13 import org.apache.hadoop.mapreduce.Mapper;
 14 import org.apache.hadoop.mapreduce.Reducer;
 15 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 16 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 17 
 18 public class WordCountApp {
 19     public static void main(String[] args) throws Exception {
 20         // 在main方法寫驅動程序,把Map函數和Reduce函數組織在一起.
 21         // 搞一個對象把Map對象和Reduce對象都放在這個對象中,我們把這個對象稱作Job
 22         // 兩個形參,一個是Configuration對象,一個是Job的名稱,這樣獲得了一個Job對象;
 23         Job job = Job.getInstance(new Configuration(),
 24                 WordCountApp.class.getSimpleName());
 25         // 對這個job進行設置
 26         job.setJarByClass(WordCountApp.class);// 通過這個設置可以讓框架識別你寫的代碼
 27         
 28         job.setMapperClass(MyMapper.class);// 把自定義的Map類放到job中
 29         job.setMapOutputKeyClass(Text.class);// 定義Map的key的輸出類型,Map的輸出是<hello,2>
 30         job.setMapOutputValueClass(LongWritable.class);// 定義Map的value的輸出類型
 31 
 32         job.setReducerClass(MyReducer.class);// 把自定義的Reducer類放到job中
 33         job.setOutputKeyClass(Text.class);// 因為Reduce的輸出是最終的數據,Reduce的輸出是<hello,2>
 34         // 所以這個方法名中沒有像Map對應的放發一樣帶有Reduce,直接就是setOutputKeyClass
 35         job.setOutputValueClass(LongWritable.class);// 定義reduce的value輸出
 36 
 37         FileInputFormat.setInputPaths(job, args[0]);// 輸入指定:傳入一個job地址.
 38         // 這個args[0] 就是新地址,"hdfs://192.168.0.170/hello"
 39         FileOutputFormat.setOutputPath(job, new Path(args[1]));
 40         // 輸出指定
 41         // 指定輸入和輸出路徑可以通過在這里寫死的方式,也可以通過main函數參數的形式
 42         // 分別是args[0]和args[1]
 43 
 44         // 把job上傳到yarn平臺上.
 45         job.waitForCompletion(true);
 46     }
 47 
 48     /*
 49      * 對于<k1,v1>而言,每一行產生一個<k1,v1>對,<k1,v1>表示<行的起始位置,行的文本內容>
 50      * 就本例而言map函數總共調用兩次,因為總共只有兩行.
 51      * 正對要統計的文本內容可以知道總共兩行,總共會調用兩次Map函數對應產生的<k1,v1>分別是<0,hello you>
 52      * 和第二個<k1,v1>是<10,hello me>
 53      */
 54     private static class MyMapper extends
 55             Mapper<LongWritable, Text, Text, LongWritable> {
 56         // 這個Mapper的泛型參數是<KEYIN,VALUEIN,KEYOUT,VALUEOUT> 分別對應的是k1,v1,k2,v2
 57         // 我們如下講的k1,v1的類型是固定的.
 58         // 就本例而言,map函數會被調用2次,因為總共文本文件就只有兩行.
 59         
 60         //要定義輸出的k2和v2.本案例中可以分析出<k2,v2>是對文本內容的統計<hello,1><hello,1><you,1><me,1>
 61         //而且<k2,v2>的內容是和<k3,v3>中的內容是一樣的.
 62         Text k2 = new Text();
 63         LongWritable v2 = new LongWritable();
 64         //重寫父類Mapper中的map方法
 65         @Override
 66         protected void map(LongWritable key, Text value,
 67                 Mapper<LongWritable, Text, Text, LongWritable>.Context context)
 68                 throws IOException, InterruptedException {
 69             //通過代碼或者案例分析就可以知道k1其實沒有什么用出的.
 70             String line = value.toString();
 71             String[] splited = line.split("\t");//根據制表分隔符機進行拆分.hello和me,you之間是一個制表分隔符.
 72             for (String word : splited) {
 73                 k2.set(word);
 74                 v2.set(1);
 75                 context.write(k2, v2);
 76                 //用context把k2,v2寫出去,框架會寫,不用我們去管.
 77             }
 78         }
 79     }
 80 
 81     private static class MyReducer extends
 82             Reducer<Text, LongWritable, Text, LongWritable> {
 83         //這個例子中的<k2,v2>和<k3,v3>中的k是一樣的,所以這里,k2當做k3了.
 84         LongWritable v3 = new LongWritable();
 85         @Override
 86         protected void reduce(Text k2, Iterable<LongWritable> v2s,
 87                 Reducer<Text, LongWritable, Text, LongWritable>.Context context)
 88                 throws IOException, InterruptedException {
 89             //Reduce是對上面Map中的結果進行匯總的.
 90             //上面拆分出來的<k2,v2>是<hello,1><hello,1><you,1><me,1>Reduce方法中就要對其進行匯總.
 91             long sum = 0L;
 92             for(LongWritable v2:v2s){
 93                 sum = sum +v2.get();//sum是long類型,v2是LongWritable類型
 94                 //LongWritable類型轉換成long類型用get()方法.
 95                 //sum的值表示單詞在整個文件中出現的中次數.
 96             }
 97             v3.set(sum);
 98             context.write(k2,v3);
 99         }
100     }
101 
102 }
復制代碼

?//===============================================================================

查看日志的時候,代碼中的System.out.println()對于Java程序輸出到控制臺,但是這個地方是把Java類打成Jar包,

放到集群中去通過命令執行的.

輸出通過日志查看的.

上面對應的Log Type:stdout?

stdout:stdout(Standardoutput)標準輸出


本文轉自SummerChill博客園博客,原文鏈接:http://www.cnblogs.com/DreamDrive/p/5492572.html,如需轉載請自行聯系原作者

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

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

相關文章

朵朵糖故事機器人怎么更新_“故事販賣機”專欄創始人溫酒的新作,奇幻世界的暖心物語很治愈...

我有酒&#xff0c;你有故事嗎&#xff1f;2015年&#xff0c;知乎上一個叫“故事販賣機”的專欄橫空出世&#xff0c;憑著一個個腦洞大開的故事&#xff0c;這個溫吞而又溫暖的專欄很快得到了讀者的認可。而其中的創始人兼主打寫手溫酒&#xff0c;更是被粉絲們親切地稱呼為“…

python3 通過百度地圖API獲取城市POI點并存于CSV格式

原文信息&#xff1a; 作者&#xff1a;WenWu_Both 出處&#xff1a;http://blog.csdn.net/wenwu_both/article/ 版權&#xff1a;本文版權歸作者和CSDN博客共有 轉載&#xff1a;歡迎轉載&#xff0c;但未經作者同意&#xff0c;必須保留此段聲明&#xff1b;必須在文章中…

使用dropwizard(3)-加入DI-dagger2

前言 習慣了Spring全家桶&#xff0c;對spring的容器愛不釋手。使用dropwizard&#xff0c;看起來確實很輕&#xff0c;然而&#xff0c;真正使用的時候不得不面臨一個問題。我們不可能一個resource就能把所有的業務邏輯囊括&#xff01;那么&#xff0c;必然就要有負責處理邏輯…

日歷對象導哪個包_微信新表情瞬間炸裂,文物表情包永恒萌呆!

11月18日晚微信上架了6個全新表情瞬間炸裂網友一天時間閱讀達16.2億&#xff0c;討論15.8萬次#微信新表情#話題翻白眼、666、讓我看看嘆氣、苦澀、裂開微信新表情雖然666但文物表情包的呆萌也能讓人瞬間裂開更能完全詮釋我的各(bu)種(wen ding)情緒先對比一下最新的6個表情[翻白…

Tensorflow一些常用基本概念與函數(1)

文章轉至 作者&#xff1a;林海山波出處&#xff1a;https://me.csdn.net/lenbow版權&#xff1a;本文版權歸作者和CSDN博客共有 寫這篇博客只為自己學習路上做個筆記&#xff0c;方便自己學習記憶&#xff0c;大家如果想看詳細文章可以去原作者主頁去看&#xff0c;同時他…

Lineageos14 20180525更新

一、ROM注意事項 拒絕任何無意義二次打包&#xff01; C大停止更新Lineageos14&#xff0c;我來接力。 二、ROM更新日志 20180525更新&#xff1a; 1、常規更新 2、安全補丁2018年5月5日 20180406更新&#xff1a; 1、增加通話錄音&#xff0c;常規更新 2、安全補丁2018年3月…

藍牙連接不上車要hfp_如何正確使用車載藍牙播放器呢?

車載藍牙是以無線藍牙技術為基礎而設計研發的車內無線免提系統。可以連接我們設計進行聽歌和打電話十分方便&#xff0c;下面諾金小編帶大家一起來看看&#xff01;下面諾金小編帶大家一起來看看一、首先是把手機和車載藍牙播放器打開&#xff0c;搜索車載藍牙播放器“809”&am…

使用Eclipse+PyDev創建Django項目一windows下

開發條件&#xff1a;eclipsepydev插件django editor插件 關于eclipse安裝小編就不多做介紹&#xff0c;我自己用的版本如下 1.安裝pydev插件 啟動Eclipse, 點擊Help->Install New Software 彈出如下框 點擊add 分別在 Name中填:Pydev, Location中填http://pydev.org/up…

如何避免踩坑--初創技術團隊組建風險預估

閑來無事翻翻微信&#xff0c;發現有不少朋友公司在招技術負責人&#xff0c;跟他們聊了幾句&#xff0c;發現大多數認知都是技術部門的效率與進度達不到要求&#xff0c;機緣巧合下&#xff0c;有幸到了Y公司跟其Boss會面&#xff0c;得知其技術團隊效率低下&#xff0c;總是不…

查詢空缺_攜程旅行2021校招開啟,9大類職位,1000+崗位空缺,本科及以上學歷...

攜程旅行2021秋季校招正式開啟&#xff01;攜程集團(納斯達克股票代碼&#xff1a;TCOM)是一家領先的在線旅游服務提供商&#xff0c;旗下品牌包括攜程、Trip.com、天巡和去哪兒。攜程集團能夠整合復雜的旅游相關信息并通過其先進的移動端App、網站以及24小時無間斷的免費客戶服…

Django web開發筆記

一、Django開發環境搭建&#xff1a; 1.安裝python&#xff1a;django可運行于版本python 2.7、3.x 2.安裝相應的IDE 3.安裝pip&#xff1a;sudo apt-get install python-pip(linux為例&#xff09; 4.安裝django&#xff1a;1&#xff09;pip安裝&#xff1a;sudo pip ins…

android 前置攝像頭預覽時 鏡像翻轉_全面屏時代,原來手機前置攝像頭都隱藏著一些缺點,你發現了嗎?...

隨著真全面屏時代的到來&#xff0c;人們已經不再滿足于劉海屏、水滴屏以及挖孔屏等&#xff0c;越來越多的手機廠商和消費者開始追求"100%全面屏"。于是如何解決手機前置攝像頭便成了最大的難題&#xff0c;畢竟只要在屏幕上放置攝像頭必然會影響屏占比&#xff0c;…

Java 調用 Python 方法學習筆記

文章轉載自&#xff1a; 作者&#xff1a;IT_xiao_bai 來源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/IT_xiao_bai/article/details/79074988 前一陣自剛好用python做了一個sae的算法模型&#xff0c;結果公…

catia怎么將特征參數化_VSLAM中特征點的參數化表示

VSLAM中特征點的參數化表示有很多&#xff0c;最直接的是用三維坐標XYZ來表示&#xff0c;但通常大家更喜歡用逆深度表示&#xff0c;因為逆深度優勢在于能夠建模無窮遠點。Open VINS文檔中給出了五種特征參數化表示&#xff1a;Global XYZ&#xff0c;Global Inverse Depth&am…

【廣州】Web前端工程師

互聯網公司找人咯~ 我們公司&#xff1a;道樂科技&#xff08;Dollar Tech&#xff09;成立于2013年11月&#xff0c;是一家致力于為資產管理和財富管理行業提供技術、產品和運營服務的科技金融企業。三年來&#xff0c;道樂人始終堅持“以客戶為中心&#xff0c;為客戶提供高品…

Java 調用 Python 方法學習筆記---之---java調用python深度學習模型運算并返回運算結果給前端(2)

上一章寫到Java 調用 Python 方法學習的三種方法&#xff0c;這里強調第三種方法。第三種方法本質上和第二種方法是一樣的&#xff0c;都是應用到 Runtime.getRuntime().exec() 去執行文件。要深度理解這種方法&#xff0c;首先要先理解一下Runtime.getRuntime().exec() 。 R…

tbslog亂碼轉換_日文游戲亂碼怎么辦 亂碼轉換工具LocaleEmulator

by Nicho Feb.23,2017許多日文游戲有諸多地區限制&#xff0c;在 win7、win8、win10 上玩時候會經常遇到日文游戲亂碼的情況&#xff0c;這時候就得用到亂碼轉換工具了&#xff0c;下面我們就來詳細說明下使用方法。常用的有 microsoft locale、applocale、NTLEA 等&…

haarcascades---各種分類器xml文件下載地址

安裝好opencv想找個人臉識別的小實驗做做&#xff0c;后來發現沒有配置文件&#xff0c;于是乎就找到了這個&#xff0c;所以就轉載過來了。 下載地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 轉載地址&#xff1a;https://blog.csdn.ne…

vue 組件屬性監聽_vuejs組件內的對象屬性監聽問題

跟數據類型是有關的。當你把一個普通的 JavaScript 對象傳給 Vue 實例的 data 選項&#xff0c;Vue 將遍歷此對象所有的屬性&#xff0c;并使用 Object.defineProperty 把這些屬性全部轉為 getter/setter。但是不是所有的變動都可以通過set/get捕捉到&#xff0c;比如一個數組l…

Part 2: Containers

要求 安裝了1.13或者更高版本的Docker閱讀了Part1中的定位&#xff08;我沒寫&#xff09;介紹 是時候用Docker構建一個app了。我們會從構建這樣一個app的最底層開始&#xff0c;容器——我們這節所介紹的內容。在這層之上是服務&#xff0c;服務定義了容器們的在生產中的行為&…