0基礎學大資料好學嗎怎麼學?看MapReduce工作流程
大資料0基礎的夥伴們,科多大資料來帶你們看看MapReduce的工作流程。
MapReduce特點
整體結構
Hadoop工作架構
我們的應用程式通過Hadoop job client向Hadoop叢集提交作業,Hadoop叢集中Master節點負責排程各個Slave節點共同完成作業。
Hadoop job client是什麼?
我認為有2個含義。1是在程式碼中使用的api,2是提交作業時使用的命令列工具。
比如在參考文章中的WordCount v1.0原始碼,main方法負責構建配置並提交作業:
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
這裡大部分的類都來自包org.apache.hadoop.mapreduce。
而在執行這個程式的時候,先生成jar包,再執行下面的命令:
$ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output
我們需要提供什麼
1.提供input locations和output location
這個是在執行jar包的命令列中提供的.
2.提供map和reduce的實現
這個對應原始碼中的TokenizerMapper和IntSumReducer類。
3.提供job引數
具體對應原始碼中的main方法.
包括上面的input/output locations, map和reduce的實現, 都需要以job引數的形式來提供, 才能實際被使用.
流程細節
flat
流水細節
client將軟體和資料提交給job,job將輸入拆分成一個個獨立的資料塊,每個資料塊提交給不同的map task來處理.
結合HDFS的內容,我推論實際的過程是這樣子的:
. job查詢NameNode後設資料,得知輸入資料檔案對應的資料塊及其所在的DataNode位置.
.然後將所要執行的軟體,和對應的資料塊的後設資料資訊傳給對應的DataNode.
.每個DataNode所接收到的軟體是一樣的,但是資料塊的後設資料資訊就只是自己相關的那一部分.
. DataNode接收軟體和資料塊後設資料之後,就找出對應的資料,作為輸入來執行軟體.
map對資料塊中的資料進行初次處理,由於每個map task處理的是不同的資料塊,所以這裡是並行的. 處理完之後輸出形式的中間結果.
框架對中間結果進行處理,對每個中間結果進行排序,分割槽,發到具體的reduce task,然後再進行排序,分組.
最後reduce程式接收到的輸入是>的格式,這是按照key進行分組的結果.
reduce負責處理>, 並輸出最終的結果到輸出目錄.
整個過程的資料型別變化情況
(input) -> map -> -> shuffle & sort -> > -> reduce -> (output)
map和reduce的個數
map task的個數 = input檔案的所有的塊的個數.
reduce task的個數可以設定:Job.setNumReduceTasks();設定的大, 會增加框架開銷, 但是可以增加負載均衡 並降低故障成本(每一個reduce負責的內容少了). 設定的小則會有相反的結論.
分割槽和reduce個數
group
MapReduce的細節
淺綠色背景是我們要做的,其他是框架做的.
Map
• map 是我們定義的map函式, 負責從我們指定的輸入中解析出作為中間結果的
• sort 負責對map的結果進行排序
• partition 負責對上一步的結果資料進行分割槽.不同的分割槽會發到不同的Reduce task.
• combine 負責本地聚合資料,這樣可以減少發到Reduce task的資料量. 由我們自己定義聚合函式,這一步不是必須的.
Reduce
• shuffle 通過HTTP接收分割槽資料
• sort 對分割槽資料排序, 分組(考慮到不同Map發來的分割槽,可能有相同的key)
• reduce 產生最終結果
結合WordCount v1.0看流程
這裡結合WordCount v1.0執行過程來對工作流程中每一步的工作有個形象的瞭解.
demo處理過程
WordCount負責統計輸入檔案中每個單詞的出現次數.
input有2個檔案, 每個檔案佔據一個資料塊(每個檔案都那麼小), 所以會有2個map task分別處理一個資料塊.
map的結果是以此記錄哪個單詞出現了一次, 並沒有進行排序和聚合處理.
map到combine之間還有一段, 就是框架對資料進行了排序, combine接收到的已經是排序的結果.
combine負責在本地聚合, 它主要可以減少資料從map到reduce的傳輸量. 可以看到combine的輸出已經是排好序且做了聚合處理.
reduce負責對接收到的來自2個map的資料塊進行再分組, 排序, 聚合. 並最終輸出結果.
相關文章
- 0基礎小白怎麼學好Java?Java
- Java零基礎好學嗎?Java該怎麼學?Java
- Python好學嗎難不難?0基礎能學會嗎?Python
- 0基礎學怎麼學習python?Python
- java好學嗎?初學者怎麼學好?Java
- 入行IT界,0基礎如何學習大資料?大資料
- 零基礎學前端難嗎?前端好學嗎?前端
- 大資料工資這麼高,零基礎可以學習嗎?大資料
- 學習大資料需要什麼基礎?大資料要學哪些內容?大資料
- 好程式設計師大資料學習路線分享MapReduce全流程總結程式設計師大資料
- 零基礎學習大資料為什麼找不到工作?大資料
- 大資料學習大綱,大資料應該怎麼學大資料
- 學大資料需要什麼語言基礎?,學前必知大資料
- 好程式設計師大資料學習路線分享MAPREDUCE程式設計師大資料
- 大資料學習:零基礎大資料入門該看哪些書?大資料
- 轉型進入IT行業,0基礎學習大資料開發需要什麼基礎?行業大資料
- 0基礎怎麼學習Python?Python學習方法彙總!Python
- 程式設計好學嗎?零基礎能學程式設計嗎?程式設計
- 怎麼學大資料?該從哪學起?大資料
- 大資料學習入門看什麼書?大資料新手怎麼入門?大資料
- 什麼是大資料?零基礎如何學習大資料?(附學習路線)大資料
- 華瑞教育教你零基礎怎麼學好IT
- 大資料學習筆記(十七)-MapReduce大資料筆記
- 0基礎學如何學web前端?Web前端
- Python零基礎好學嗎?零基礎如何學習Python?Python
- 0基礎學習大資料你需要了解的學習路線和方向大資料
- 大資料學習方法,學大資料需要的基礎和路線大資料
- 小白可以轉行學習大資料嗎?怎麼做?大資料
- 女孩子學大資料好找工作嗎?大資料
- 好程式設計師大資料學習路線之mapreduce概述程式設計師大資料
- 好程式設計師大資料培訓教你快速學習MapReduce程式設計師大資料
- 零基礎學Java能找到工作嗎?Java
- PHP、Python、前端,0基礎學哪個好?PHPPython前端
- Java、Python以及大資料哪個適合0基礎學?JavaPython大資料
- 學習Java好找工作嗎?Java學完後薪資怎麼樣?Java
- java怎麼學才能學好?Java
- 大資料到底怎麼學:資料科學概論與大資料學習誤區大資料資料科學
- 0基礎能學習Linux運維嗎?Linux初學Linux運維