筆記中提供了大量的代碼示例,需要說明的是,大部分代碼示例都是本人所敲代碼并進行測試,不足之處,請大家指正~
LZ 本來想先仔細寫一寫 Hadoop 偽分布式的部署安裝,然后介紹一些 HDFS 的內(nèi)容再來介紹 MapReduce,是在是沒有抽出空,今天就簡單入門一下 MapReduce 吧。
一、MapReduce 概述
1.MapReduce 是一種分布式計算模型,由Google提出,主要用于搜索領(lǐng)域,解決海量數(shù)據(jù)的計算問題.
2.MapReduce 由兩個階段組成:Map和Reduce,用戶只需要實現(xiàn)map()和reduce()兩個函數(shù),即可實現(xiàn)分布式計算
二、具體實現(xiàn)
1.先來看一下 Eclipse 中此應用的包結(jié)構(gòu)
2.創(chuàng)建 map 的任務處理類:WCMapper
/* * 1.Mapper 類的四個泛型中,前兩個指定 mapper 輸入數(shù)據(jù)的類型,后兩個指定 mapper 輸出數(shù)據(jù)的類型 * KEYIN 是輸入的 key 的類型,VALUEIN 是輸入的 value 的類型 * KEYOUT 是輸出的 key 的類型,VALUEOUT 是輸出的 value 的類型 * 2.map 和 reduce 的數(shù)據(jù)的輸入輸出都是以 key-value 對的形式封裝的 * 3.默認情況下,框架傳遞給我們的 mapper 的輸入數(shù)據(jù)中,key 是要處理的文本中一行的起始偏移量,為 Long 類型, * 這一行的內(nèi)容為 value,為 String 類型的 * 4.后兩個泛型的賦值需要我們結(jié)合實際情況 * 5.為了在網(wǎng)絡中傳輸時序列化更高效,Hadoop 把 Java 中的 Long 封裝為 LongWritable, 把 String 封裝為 Text */public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> { //重寫 Mapper 中的 map 方法,MapReduce 框架每讀一行數(shù)據(jù)就調(diào)用一次此方法 @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //書寫具體的業(yè)務邏輯,業(yè)務要處理的數(shù)據(jù)已經(jīng)被框架傳遞進來,就是方法的參數(shù)中的 key 和 value //key 是這一行數(shù)據(jù)的起始偏移量,value 是這一行的文本內(nèi)容 //1.將 Text 類型的一行的內(nèi)容轉(zhuǎn)為 String 類型 String line = value.toString(); //2.使用 StringUtils 以空格切分字符串,返回 String[] String[] words = StringUtils.split(line, " "); //3.循環(huán)遍歷 String[],調(diào)用 context 的 writer()方法,輸出為 key-value 對的形式 //key:單詞 value:1 for(String word : words) { context.write(new Text(word), new LongWritable(1)); } }}
2.創(chuàng)建 reduce 的任務處理類:WCReducer:
/* * 1.Reducer 類的四個泛型中,前兩個輸入要與 Mapper 的輸出相對應。輸出需要聯(lián)系具體情況自定義 */public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> { //框架在 map 處理完之后,將所有的 kv 對緩存起來,進行分組,然后傳遞一個分組(<key,{values}>,例如:<"hello",{1,1,1,1}>), //調(diào)用此方法 @Override protected void reduce(Text key, Iterable<LongWritable> values, Context context)throws IOException, InterruptedException { //1.定義一個計數(shù)器 long count = 0; //2.遍歷 values的 list,進行累加求和 for(LongWritable value : values) { //使用 LongWritable 的 get() 方法,可以將 一個 LongWritable 類型轉(zhuǎn)為 Long 類型 count += value.get(); } //3.輸出這一個單詞的統(tǒng)計結(jié)果 context.write(key, new LongWritable(count)); }}
新聞熱點
疑難解答
圖片精選