亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 編程設計 > 正文

MapReduce 入門之一步步自實現詞頻統計功能的教程

2020-07-14 13:50:38
字體:
來源:轉載
供稿:網友

筆記中提供了大量的代碼示例,需要說明的是,大部分代碼示例都是本人所敲代碼并進行測試,不足之處,請大家指正~

LZ 本來想先仔細寫一寫 Hadoop 偽分布式的部署安裝,然后介紹一些 HDFS 的內容再來介紹 MapReduce,是在是沒有抽出空,今天就簡單入門一下 MapReduce 吧。

一、MapReduce 概述

1.MapReduce 是一種分布式計算模型,由Google提出,主要用于搜索領域,解決海量數據的計算問題.

2.MapReduce 由兩個階段組成:Map和Reduce,用戶只需要實現map()和reduce()兩個函數,即可實現分布式計算

二、具體實現

1.先來看一下 Eclipse 中此應用的包結構

2.創建 map 的任務處理類:WCMapper

 

/* * 1.Mapper 類的四個泛型中,前兩個指定 mapper 輸入數據的類型,后兩個指定 mapper 輸出數據的類型 *   KEYIN 是輸入的 key 的類型,VALUEIN 是輸入的 value 的類型 *   KEYOUT 是輸出的 key 的類型,VALUEOUT 是輸出的 value 的類型 * 2.map 和 reduce 的數據的輸入輸出都是以 key-value 對的形式封裝的 * 3.默認情況下,框架傳遞給我們的 mapper 的輸入數據中,key 是要處理的文本中一行的起始偏移量,為 Long 類型, * 這一行的內容為 value,為 String 類型的  * 4.后兩個泛型的賦值需要我們結合實際情況 * 5.為了在網絡中傳輸時序列化更高效,Hadoop 把 Java 中的 Long 封裝為 LongWritable, 把 String 封裝為 Text */public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {        //重寫 Mapper 中的 map 方法,MapReduce 框架每讀一行數據就調用一次此方法    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        //書寫具體的業務邏輯,業務要處理的數據已經被框架傳遞進來,就是方法的參數中的 key 和 value        //key 是這一行數據的起始偏移量,value 是這一行的文本內容                //1.將 Text 類型的一行的內容轉為 String 類型        String line = value.toString();                //2.使用 StringUtils 以空格切分字符串,返回 String[]        String[] words = StringUtils.split(line, " ");                //3.循環遍歷 String[],調用 context 的 writer()方法,輸出為 key-value 對的形式        //key:單詞   value:1        for(String word : words) {            context.write(new Text(word), new LongWritable(1));        }            }}

2.創建 reduce 的任務處理類:WCReducer:

 

/* * 1.Reducer 類的四個泛型中,前兩個輸入要與 Mapper 的輸出相對應。輸出需要聯系具體情況自定義 */public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {        //框架在 map 處理完之后,將所有的 kv 對緩存起來,進行分組,然后傳遞一個分組(<key,{values}>,例如:<"hello",{1,1,1,1}>),    //調用此方法    @Override    protected void reduce(Text key, Iterable<LongWritable> values, Context context)throws IOException, InterruptedException {                //1.定義一個計數器        long count = 0;                //2.遍歷 values的 list,進行累加求和        for(LongWritable value : values) {            //使用 LongWritable 的 get() 方法,可以將 一個 LongWritable 類型轉為 Long 類型            count += value.get();        }                //3.輸出這一個單詞的統計結果        context.write(key, new LongWritable(count));    }}

3.創建一個類,用來描述一個特定的作業:WCRunner,(此類了LZ沒有按照規范的模式寫)

 

/** * 此類用來描述一個特定的作業 * 例:1.該作業使用哪個類作為邏輯處理中的 map,哪個作為 reduce *       2.指定該作業要處理的數據所在的路徑 *       3.指定該作業輸出的結果放到哪個路徑 */public class WCRunner {        public static void main(String[] args) throws Exception {                //1.獲取 Job 對象:使用 Job 靜態的 getInstance() 方法,傳入 Configuration 對象        Configuration conf = new Configuration();        Job wcJob = Job.getInstance(conf);                //2.設置整個 Job 所用的類的 jar 包:使用 Job 的 setJarByClass(),一般傳入  當前類.class        wcJob.setJarByClass(WCRunner.class);                //3.設置本 Job 使用的 mapper 和 reducer 的類        wcJob.setMapperClass(WCMapper.class);        wcJob.setReducerClass(WCReducer.class);                        //4.指定 reducer 輸出數據的 kv 類型  注:若 mapper 和 reducer 的輸出數據的 kv 類型一致,可以用如下兩行代碼設置        wcJob.setOutputKeyClass(Text.class);        wcJob.setOutputValueClass(LongWritable.class);                //5.指定 mapper 輸出數據的 kv 類型        wcJob.setMapOutputKeyClass(Text.class);        wcJob.setMapOutputValueClass(LongWritable.class);                //6.指定原始的輸入數據存放路徑:使用 FileInputFormat 的 setInputPaths() 方法        FileInputFormat.setInputPaths(wcJob, new Path("/wc/srcdata/"));                //7.指定處理結果的存放路徑:使用 FileOutputFormat 的 setOutputFormat() 方法        FileOutputFormat.setOutputPath(wcJob, new Path("/wc/output/"));                //8.將 Job 提交給集群運行,參數為 true 表示顯示運行狀態        wcJob.waitForCompletion(true);            }}

4.將此項目導出為 jar 文件

步驟:右擊項目 --->  Export ---> Java ---> JAR file --->指定導出路徑(我指定的為:e:/wc.jar) ---> Finish

5.將導出的 jar 包上傳到 linux 上

LZ使用的方法是:在 SecureCRT 客戶端中使用 Alt + p 快捷鍵打開上傳文件的終端,輸入 put e"/wc.jar  即可上傳

6.創建初始測試文件:words.log

命令: vi words.log    自己輸入測試數據即可

7.在 hdfs 中創建存放初始測試文件 words.log 的目錄:我們在 WCRunner 中指定的是  /wc/srcdata/

命令:

[hadoop@crawl ~]$ hadoop fs -mkdir /wc
[hadoop@crawl ~]$ hadoop fs -mkdir /wc/srcdata

8.將初始測試文件 words.log 上傳到 hdfs 的相應目錄

命令:[hadoop@crawl ~]$ hadoop fs -put words.log /wc/srcdata

9.運行 jar 文件

命令:hadoop jar wc.jar com.software.hadoop.mr.wordcount.WCRunner

此命令為  hadoop jar wc.jar 加上 WCRunner類的全類名,程序的入口為 WCRunner 內的 main 方法,運行完此命令便可以看到輸出日志信息:

然后前去我們之前配置的存放輸出結果的路徑(LZ之前設置的為:/wc/output/)就可以看到 MapReduce 的執行結果了

輸入命令:hadoop fs -ls /wc/output/  查看以下 /wc/output/ 路徑下的內容

結果數據就在第二個文件中,輸入命令:hadoop fs -cat /wc/output/part-r-00000   即可查看:

至此我們的這個小應用就完成了,是不是很有意思的,LZ 在實現的時候還是發生了一點小意外:

LZ 查閱資料發現這是由于 jdk 版本不一致導致的錯誤,統一 jdk 版本后便沒有問題了。

以上這篇MapReduce 入門之一步步自實現詞頻統計功能的教程就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品性视频| 国产精品美女久久久免费| 亚洲精品国产精品国自产在线| 国产999在线| 亚洲va码欧洲m码| 久久久免费观看| 精品国产依人香蕉在线精品| 亚洲精品久久久久国产| 日本在线观看天堂男亚洲| 亚洲第一视频网| 亚洲欧美综合v| 精品综合久久久久久97| 国产欧美精品一区二区| 亚洲精品成人久久| 国内精品久久久久久影视8| 欧美视频专区一二在线观看| 亚洲国产精品成人一区二区| 中文字幕视频在线免费欧美日韩综合在线看| 国产欧美日韩中文| 日韩欧美国产黄色| 久久久91精品国产一区不卡| 久久综合五月天| 欧洲成人免费aa| 久久精品小视频| 精品偷拍一区二区三区在线看| 国内精品在线一区| 98精品国产高清在线xxxx天堂| 在线观看日韩www视频免费| 91精品国产一区| 亚洲乱码国产乱码精品精| 91社区国产高清| 日本一区二区三区四区视频| 97色在线播放视频| 国产精品扒开腿做爽爽爽视频| 亚洲精品乱码久久久久久金桔影视| 国产精品小说在线| 深夜福利亚洲导航| 欧美性猛交xxxx黑人| 日韩a**中文字幕| 7777免费精品视频| 亚洲欧洲在线看| 欧美视频免费在线观看| 欧美精品18videosex性欧美| 欧美成人h版在线观看| 一区二区欧美亚洲| 欧美极品美女视频网站在线观看免费| 亚洲成人a级网| 日韩av在线网页| 97视频网站入口| 亚洲国产高清福利视频| 成人中文字幕+乱码+中文字幕| 日韩资源在线观看| 91精品视频在线| 在线日韩中文字幕| 欧美裸体xxxx极品少妇软件| 国产精品日韩av| 国产精品嫩草影院一区二区| 日韩精品免费在线视频| 国产在线98福利播放视频| 色综合伊人色综合网站| 欧美日韩亚洲一区二区三区| 日本一本a高清免费不卡| 亚洲毛茸茸少妇高潮呻吟| 欧美综合在线观看| 日韩av电影手机在线观看| 久久成人精品电影| 日韩av第一页| 日韩美女在线观看一区| 国产性色av一区二区| 亚洲精品国产精品国产自| 欧美自拍视频在线观看| 中文字幕日韩精品有码视频| 日韩在线中文字幕| 日本国产一区二区三区| 国产精品国产三级国产专播精品人| 欧美性xxxx在线播放| 国产亚洲欧美日韩美女| 日韩免费在线免费观看| 成人性生交大片免费观看嘿嘿视频| 庆余年2免费日韩剧观看大牛| 日韩精品在线观| 97国产成人精品视频| www.国产精品一二区| 精品亚洲一区二区三区在线播放| 九九九久久国产免费| 成人午夜一级二级三级| 91麻豆桃色免费看| 成人女保姆的销魂服务| 宅男66日本亚洲欧美视频| 日韩电影大全免费观看2023年上| 欧美成年人视频网站欧美| 国产欧美 在线欧美| 5252色成人免费视频| 午夜精品久久久久久久男人的天堂| 欧美综合在线观看| 久久国产加勒比精品无码| 大荫蒂欧美视频另类xxxx| 国产精品久久久久久久久久99| 久久久人成影片一区二区三区| 在线免费观看羞羞视频一区二区| 精品一区二区三区四区| 亚洲欧美日韩国产成人| 成人免费高清完整版在线观看| 成人动漫网站在线观看| 欧美中文字幕视频在线观看| 久久久免费观看视频| 久热精品视频在线| 久久男人av资源网站| 国产精品丝袜白浆摸在线| 夜夜嗨av一区二区三区四区| 懂色aⅴ精品一区二区三区蜜月| 国产xxx69麻豆国语对白| 狠狠色香婷婷久久亚洲精品| 国产乱肥老妇国产一区二| 91久久精品美女| 亚洲精品456在线播放狼人| 最近的2019中文字幕免费一页| 91情侣偷在线精品国产| 久久在精品线影院精品国产| 欧美在线视频在线播放完整版免费观看| 国产一区二区三区在线免费观看| 精品久久香蕉国产线看观看gif| 色综合久久中文字幕综合网小说| 欧美激情一区二区三级高清视频| 欧美日韩一区二区在线播放| 亚洲片av在线| 成人黄色片在线| 国产精品永久免费观看| 91国产视频在线播放| 欧美大成色www永久网站婷| 中文日韩在线视频| 亚洲香蕉在线观看| 国产精品精品一区二区三区午夜版| 97国产精品视频| 国产一区二区三区网站| 日韩欧美aⅴ综合网站发布| 欧美成人国产va精品日本一级| 日韩中文理论片| 久久网福利资源网站| 91亚洲精品在线观看| 中文欧美日本在线资源| 奇门遁甲1982国语版免费观看高清| 狠狠躁夜夜躁人人爽超碰91| 精品在线欧美视频| 欧美极品少妇xxxxⅹ喷水| 91精品在线播放| 都市激情亚洲色图| 国产91在线高潮白浆在线观看| 亚洲国产成人久久| 456国产精品| 日本欧美在线视频| 国产精品久久久91| 伊人激情综合网| 正在播放亚洲1区| 57pao成人永久免费视频| 日韩欧美国产免费播放| 亚洲国产精彩中文乱码av| 亚洲第一综合天堂另类专| 欧美日韩中文在线观看| 97超级碰在线看视频免费在线看| 日韩第一页在线| 在线观看国产欧美| 麻豆成人在线看| 国产精品成人免费电影|