這篇文章主要介紹“Hadoop MapReduce是什么”,在日常操作中,相信很多人在Hadoop MapReduce是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hadoop MapReduce是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
為蔚縣等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及蔚縣網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站制作、蔚縣網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
MapReduce是一個分布式運算程序的編程框架,是用戶開發(fā)“基于Hadoop的數(shù)據(jù)分析應(yīng)用”的核心框架。
MapReduce核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認(rèn)組件整合成一個完整的分布式運算程序,并發(fā)運行在一個Hadoop集群上。
MapReduce思想在生活中處處可見?;蚨嗷蛏俣荚佑|過這種思想。MapReduce的思想核心是“分而治之”,適用于大量復(fù)雜的任務(wù)處理場景(大規(guī)模數(shù)據(jù)處理場景)。即使是發(fā)布過論文實現(xiàn)分布式計算的谷歌也只是實現(xiàn)了這種思想,而不是自己原創(chuàng)。
Map負(fù)責(zé)“分”,即把復(fù)雜的任務(wù)分解為若干個“簡單的任務(wù)”來并行處理??梢赃M(jìn)行拆分的前提是這些小任務(wù)可以并行計算,彼此間幾乎沒有依賴關(guān)系。
Reduce負(fù)責(zé)“合”,即對map階段的結(jié)果進(jìn)行全局匯總。
這兩個階段合起來正是MapReduce思想的體現(xiàn)。
還有一個比較形象的語言解釋MapReduce:
我們要數(shù)圖書館中的所有書。你數(shù)1號書架,我數(shù)2號書架。這就是“Map”。我們?nèi)嗽蕉?,?shù)書就越快。
現(xiàn)在我們到一起,把所有人的統(tǒng)計數(shù)加在一起。這就是“Reduce”。
MapReduce是采用一種分而治之的思想設(shè)計出來的分布式計算框架
那什么是分而治之呢?
比如一復(fù)雜、計算量大、耗時長的的任務(wù),暫且稱為“大任務(wù)”;
此時使用單臺服務(wù)器無法計算或較短時間內(nèi)計算出結(jié)果時,可將此大任務(wù)切分成一個個小的任務(wù),小任務(wù)分別在不同的服務(wù)器上并行的執(zhí)行;
最終再匯總每個小任務(wù)的結(jié)果
MapReduce由兩個階段組 成:
Map階段(切分成一個個小的任務(wù))
Reduce階段(匯總小任務(wù)的結(jié)果)
map階段有一個關(guān)鍵的map()函數(shù);
此函數(shù)的輸入是鍵值對
輸出是一系列鍵值對,輸出寫入本地磁盤。
reduce階段有一個關(guān)鍵的函數(shù)reduce()函數(shù)
此函數(shù)的輸入也是鍵值對(即map的輸出(kv對))
輸出也是一系列鍵值對,結(jié)果最終寫入HDFS
Map&Reduce
mapReduce編程模型的總結(jié):
MapReduce的開發(fā)一共有八個步驟其中map階段分為2個步驟,shuffle階段4個步驟,reduce階段分為2個步驟
第一步:設(shè)置inputFormat類,將我們的數(shù)據(jù)切分成key,value對,輸入到第二步
第二步:自定義map邏輯,處理我們第一步的輸入數(shù)據(jù),然后轉(zhuǎn)換成新的key,value對進(jìn)行輸出
第三步:對輸出的key,value對進(jìn)行分區(qū)。(相同key的數(shù)據(jù)屬于同一分區(qū))
第四步:對不同分區(qū)的數(shù)據(jù)按照相同的key進(jìn)行排序
第五步:對分組后的數(shù)據(jù)進(jìn)行規(guī)約(combine操作),降低數(shù)據(jù)的網(wǎng)絡(luò)拷貝(可選步驟)
第六步:對排序后的數(shù)據(jù)進(jìn)行分組,分組的過程中,將相同key的value放到一個集合當(dāng)中(每組數(shù)據(jù)調(diào)用一次reduce方法)
第七步:對多個map的任務(wù)進(jìn)行合并,排序,寫reduce函數(shù)自己的邏輯,對輸入的key,value對進(jìn)行處理,轉(zhuǎn)換成新的key,value對進(jìn)行輸出
第八步:設(shè)置outputformat將輸出的key,value對數(shù)據(jù)進(jìn)行保存到文件中。
hadoop沒有沿用java當(dāng)中基本的數(shù)據(jù)類型,而是自己進(jìn)行封裝了一套數(shù)據(jù)類型,其自己封裝的類型與java的類型對應(yīng)如下
下表常用的數(shù)據(jù)類型對應(yīng)的Hadoop數(shù)據(jù)序列化類型
Java類型 | Hadoop Writable類型 |
---|---|
Boolean | BooleanWritable |
Byte | ByteWritable |
Int | IntWritable |
Float | FloatWritable |
Long | LongWritable |
Double | DoubleWritable |
String | Text |
Map | MapWritable |
Array | ArrayWritable |
byte[] | BytesWritable |
需求:現(xiàn)有數(shù)據(jù)格式如下,每一行數(shù)據(jù)之間都是使用逗號進(jìn)行分割,求取每個單詞出現(xiàn)的次數(shù)
hello,hello world,world hadoop,hadoop hello,world hello,flume hadoop,hive hive,kafka flume,storm hive,oozie
cloudera https://repository.cloudera.com/artifactory/cloudera-repos/ org.apache.hadoop hadoop-client 2.6.0-mr1-cdh6.14.2 org.apache.hadoop hadoop-common 2.6.0-cdh6.14.2 org.apache.hadoop hadoop-hdfs 2.6.0-cdh6.14.2 org.apache.hadoop hadoop-mapreduce-client-core 2.6.0-cdh6.14.2 junit junit 4.11 test org.testng testng RELEASE test org.apache.maven.plugins maven-compiler-plugin 3.0 1.8 UTF-8 org.apache.maven.plugins maven-shade-plugin 2.4.3 package shade true
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; /** * 自定義mapper類需要繼承Mapper,有四個泛型, * keyin: k1 行偏移量 Long * valuein: v1 一行文本內(nèi)容 String * keyout: k2 每一個單詞 String * valueout : v2 1 int * 在hadoop當(dāng)中沒有沿用Java的一些基本類型,使用自己封裝了一套基本類型 * long ==>LongWritable * String ==> Text * int ==> IntWritable * */ public class MyMapper extends Mapper{ /** * 繼承mapper之后,覆寫map方法,每次讀取一行數(shù)據(jù),都會來調(diào)用一下map方法 * @param key:對應(yīng)k1 * @param value:對應(yīng)v1 * @param context 上下文對象。承上啟下,承接上面步驟發(fā)過來的數(shù)據(jù),通過context將數(shù)據(jù)發(fā)送到下面的步驟里面去 * @throws IOException * @throws InterruptedException * k1 v1 * 0;hello,world * * k2 v2 * hello 1 * world 1 */ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //獲取我們的一行數(shù)據(jù) String line = value.toString(); String[] split = line.split(","); Text text = new Text(); IntWritable intWritable = new IntWritable(1); for (String word : split) { //將每個單詞出現(xiàn)都記做1次 //key2 Text類型 //v2 IntWritable類型 text.set(word); //將我們的key2 v2寫出去到下游 context.write(text,intWritable); } } }
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class MyReducer extends Reducer{ //第三步:分區(qū) 相同key的數(shù)據(jù)發(fā)送到同一個reduce里面去,相同key合并,value形成一個集合 /** * 繼承Reducer類之后,覆寫reduce方法 * @param key * @param values * @param context * @throws IOException * @throws InterruptedException */ @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { int result = 0; for (IntWritable value : values) { //將我們的結(jié)果進(jìn)行累加 result += value.get(); } //繼續(xù)輸出我們的數(shù)據(jù) IntWritable intWritable = new IntWritable(result); //將我們的數(shù)據(jù)輸出 context.write(key,intWritable); } }
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; 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.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; /* 這個類作為mr程序的入口類,這里面寫main方法 */ public class WordCount extends Configured implements Tool{ /** * 實現(xiàn)Tool接口之后,需要實現(xiàn)一個run方法, * 這個run方法用于組裝我們的程序的邏輯,其實就是組裝八個步驟 * @param args * @return * @throws Exception */ @Override public int run(String[] args) throws Exception { //獲取Job對象,組裝我們的八個步驟,每一個步驟都是一個class類 Configuration conf = super.getConf(); Job job = Job.getInstance(conf, "mrdemo1"); //實際工作當(dāng)中,程序運行完成之后一般都是打包到集群上面去運行,打成一個jar包 //如果要打包到集群上面去運行,必須添加以下設(shè)置 job.setJarByClass(WordCount.class); //第一步:讀取文件,解析成key,value對,k1:行偏移量 v1:一行文本內(nèi)容 job.setInputFormatClass(TextInputFormat.class); //指定我們?nèi)ツ囊粋€路徑讀取文件 TextInputFormat.addInputPath(job,new Path("文件位置")); //第二步:自定義map邏輯,接受k1 v1 轉(zhuǎn)換成為新的k2 v2輸出 job.setMapperClass(MyMapper.class); //設(shè)置map階段輸出的key,value的類型,其實就是k2 v2的類型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); //第三步到六步:分區(qū),排序,規(guī)約,分組都省略 //第七步:自定義reduce邏輯 job.setReducerClass(MyReducer.class); //設(shè)置key3 value3的類型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //第八步:輸出k3 v3 進(jìn)行保存 job.setOutputFormatClass(TextOutputFormat.class); //一定要注意,輸出路徑是需要不存在的,如果存在就報錯 TextOutputFormat.setOutputPath(job,new Path("輸出文件位置")); //提交job任務(wù) boolean b = job.waitForCompletion(true); return b?0:1; /*** * 第一步:讀取文件,解析成key,value對,k1 v1 * 第二步:自定義map邏輯,接受k1 v1 轉(zhuǎn)換成為新的k2 v2輸出 * 第三步:分區(qū)。相同key的數(shù)據(jù)發(fā)送到同一個reduce里面去,key合并,value形成一個集合 * 第四步:排序 對key2進(jìn)行排序。字典順序排序 * 第五步:規(guī)約 combiner過程 調(diào)優(yōu)步驟 可選 * 第六步:分組 * 第七步:自定義reduce邏輯接受k2 v2 轉(zhuǎn)換成為新的k3 v3輸出 * 第八步:輸出k3 v3 進(jìn)行保存 * * */ } /* 作為程序的入口類 */ public static void main(String[] args) throws Exception { Configuration configuration = new Configuration(); configuration.set("hello","world"); //提交run方法之后,得到一個程序的退出狀態(tài)碼 int run = ToolRunner.run(configuration, new WordCount(), args); //根據(jù)我們 程序的退出狀態(tài)碼,退出整個進(jìn)程 System.exit(run); } }
到此,關(guān)于“Hadoop MapReduce是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞名稱:HadoopMapReduce是什么
地址分享:http://weahome.cn/article/gehpso.html