MapReduce入門及核心流程案例
文章目錄
第1章 MapReduce入門
1.1 MapReduce定義
1.2 MapReduce優缺點
1.3 MapReduce核心思想
1)分散式的運算程式往往需要分成至少2個階段。
2)第一個階段的MapTask併發例項,完全並行執行,互不相干。
3)第二個階段的ReduceTask併發例項互不相干,但是他們的資料依賴於上一個階段的所有MapTask併發例項的輸出。
4)MapReduce程式設計模型只能包含一個Map階段和一個Reduce階段,如果使用者的業務邏輯非常複雜,那就只能多個MapReduce程式,序列執行。
1.4 MapReduce程式
1.5 MapReduce程式設計規範
使用者編寫的程式分成三個部分:Mapper、Reducer和Driver。
1.6 核心流程案例
MapReduce的執行流程概述
需求: 統計/hello目錄中每個檔案的單詞數量,
a-p開頭的單詞放入到一個結果檔案中,
q-z開頭的單詞放入到一個結果檔案中。
例如: /hello/a.txt 200M
hello,hi,hadoop
hive,hadoop,hive,
zoo,spark,wow
zoo,spark,wow
...
/hello/b.txt 100m
hello,hi,hadoop
zoo,spark,wow
...
1.Map階段(執行MapTask,將一個大的任務切分為若干小任務,處理輸出階段性的結果)
①切片(切分資料)
/hello/a.txt 200M
/hello/b.txt 100m
預設的切分策略是以檔案為單位,以檔案的塊大小(128M)為片大小進行切片!
split0:/hello/a.txt,0-128M
split1: /hello/a.txt,128M-200M
split2: /hello/b.txt,0M-100M
②執行MapTask(程式),每個MapTask負責一片資料
split0:/hello/a.txt,0-128M--------MapTask1
split1: /hello/a.txt,128M-200M--------MapTask2
split2: /hello/b.txt,0M-100M--------MapTask3
③讀取資料階段
在MR中,所有的資料必須封裝為key-value
MapTask1,2,3都會初始化一個InputFormat(預設TextInputFormat),每個InputFormat物件負責建立一個RecordReader(LineRecordReader)物件,
RecordReader負責從每個切片的資料中讀取資料,封裝為key-value.
LineRecordReader: 將檔案中的每一行封裝為一個key(offset)-value(當前行的內容)
舉例:
hello,hi,hadoop----->(0,hello,hi,hadoop)
hive,hadoop,hive----->(20,hive,hadoop,hive)
zoo,spark,wow----->(30,zoo,spark,wow)
zoo,spark,wow----->(40,zoo,spark,wow)
④進入Mapper的map()階段
map()是Map階段的核心處理邏輯! 單詞統計! map()會迴圈呼叫,對輸入的每個Key-value都進行處理!
輸入:(0,hello,hi,hadoop)
輸出:(hello,1),(hi,1),(hadoop,1)
輸入:(20,hive,hadoop,hive)
輸出:(hive,1),(hadoop,1),(hive,1)
輸入:(30,zoo,spark,wow)
輸出:(zoo,1),(spark,1),(wow,1)
輸入:(40,zoo,spark,wow)
輸出:(zoo,1),(spark,1),(wow,1)
⑤目前,我們需要啟動兩個ReduceTask,生成兩個結果檔案,需要將MapTask輸出的記錄進行分割槽(分組,分類)
在Mapper輸出後,呼叫Partitioner,對Mapper輸出的key-value進行分割槽,分割槽後也會排序(預設字典順序排序)
分割槽規則: a-p開頭的單詞放入到一個區
q-z開頭的單詞放入到另一個區
MapTask1:
0號區: (hadoop,1),(hadoop,1),(hello,1),(hi,1),(hive,1),(hive,1)
1號區: (spark,1),(spark,1),(wow,1) ,(wow,1),(zoo,1)(zoo,1)
MapTask2:
0號區: 。。。
1號區: ...
MapTask3:
0號區: (hadoop,1),(hello,1),(hi,1),
1號區: (spark,1),(wow,1),(zoo,1)
2.Reduce階段
①copy
ReduceTask啟動後,會啟動shuffle執行緒,從MapTask中拷貝相應分割槽的資料!
ReduceTask1: 只負責0號區
將三個MapTask,生成的0號區資料全部拷貝到ReduceTask所在的機器!
(hadoop,1),(hadoop,1),(hello,1),(hi,1),(hive,1),(hive,1)
(hadoop,1),(hello,1),(hi,1),
ReduceTask2: 只負責1號區
將三個MapTask,生成的1號區資料全部拷貝到ReduceTask所在的機器!
(spark,1),(spark,1),(wow,1) ,(wow,1),(zoo,1)(zoo,1)
(spark,1),(wow,1),(zoo,1)
②sort
ReduceTask1: 只負責0號區進行排序:
(hadoop,1),(hadoop,1),(hadoop,1),(hello,1),(hello,1),(hi,1),(hi,1),(hive,1),(hive,1)
ReduceTask2: 只負責1號區進行排序:
(spark,1),(spark,1),(spark,1),(wow,1) ,(wow,1),(wow,1),(zoo,1),(zoo,1)(zoo,1)
③reduce
ReduceTask1---->Reducer----->reduce(一次讀入一組資料)
何為一組資料: key相同的為一組資料
輸入: (hadoop,1),(hadoop,1),(hadoop,1)
輸出: (hadoop,3)
輸入: (hello,1),(hello,1)
輸出: (hello,2)
輸入: (hi,1),(hi,1)
輸出: (hi,2)
輸入:(hive,1),(hive,1)
輸出: (hive,2)
ReduceTask2---->Reducer----->reduce(一次讀入一組資料)
輸入: (spark,1),(spark,1),(spark,1)
輸出: (spark,3)
輸入: (wow,1) ,(wow,1),(wow,1)
輸出: (wow,3)
輸入:(zoo,1),(zoo,1)(zoo,1)
輸出: (zoo,3)
④呼叫OutPutFormat中的RecordWriter將Reducer輸出的記錄寫出
ReduceTask1---->OutPutFormat(預設TextOutPutFormat)------>RecordWriter(LineRecoreWriter)
LineRecoreWriter將一個key-value以一行寫出,key和alue之間使用\t分割
在輸出目錄中,生成檔案part-r-0000
hadoop 3
hello 2
hi 2
hive 2
ReduceTask2---->OutPutFormat(預設TextOutPutFormat)------>RecordWriter(LineRecoreWriter)
LineRecoreWriter將一個key-value以一行寫出,key和alue之間使用\t分割
在輸出目錄中,生成檔案part-r-0001
spark 3
wow 3
zoo 3
總結
MR的核心程式設計思想
1.概念
Job(作業) : 一個MR程式稱為一個Job
MRAppMaster(MR任務的主節點): 一個Job在執行時,會先啟動一個程式,這個程式為 MRAppMaster。
負責Job中執行狀態的監控,容錯,和RM申請資源,提交Task等!
Task(任務): Task是一個程式!負責某項計算!
Map(Map階段): Map是MapReduce程式執行的第一個階段!
Map階段的目的是將輸入的資料,進行切分。將一個大資料,切分為若干小部分!
切分後,每個部分稱為1片(split),每片資料會交給一個Task(程式)進行計算!
Task負責是Map階段程式的計算,稱為MapTask!
在一個MR程式的Map階段,會啟動N(取決於切片數)個MapTask。每個MapTask是並行執行!
Reduce(Reduce階段): Reduce是MapReduce程式執行的第二個階段(最後一個階段)!
Reduce階段的目的是將Map階段,每個MapTask計算後的結果進行合併彙總!得到最終結果!
Reduce階段是可選的!
Task負責是Reduce階段程式的計算,稱為ReduceTask!
一個Job可以通過設定,啟動N個ReduceTask,這些ReduceTask也是並行執行!
每個ReduceTask最終都會產生一個結果!
2.MapReduce中常用的元件
①Mapper: map階段核心的處理邏輯
②Reducer: reduce階段核心的處理邏輯
③InputFormat: 輸入格式
MR程式必須指定一個輸入目錄,一個輸出目錄!
InputFormat代表輸入目錄中檔案的格式!
如果是普通檔案,可以使用FileInputFormat.
如果是SequeceFile(hadoop提供的一種檔案格式),可以使用SequnceFileInputFormat.
如果處理的資料在資料庫中,需要使用DBInputFormat
④RecordReader: 記錄讀取器
RecordReader負責從輸入格式中,讀取資料,讀取後封裝為一組記錄(k-v)!
⑤OutPutFormat: 輸出格式
OutPutFormat代表MR處理後的結果,要以什麼樣的檔案格式寫出!
將結果寫出到一個普通檔案中,可以使用FileOutputFormat!
將結果寫出到資料庫中,可以使用DBOutPutFormat!
將結果寫出到SequeceFile中,可以使用SequnceFileOutputFormat
⑥RecordWriter: 記錄寫出器
RecordWriter將處理的結果以什麼樣的格式,寫出到輸出檔案中!
在MR中資料的流程:
①InputFormat呼叫RecordReader,從輸入目錄的檔案中,讀取一組資料,封裝為keyin-valuein物件
②將封裝好的key-value,交給Mapper.map()------>將處理的結果寫出 keyout-valueout
③ReduceTask啟動Reducer,使用Reducer.reduce()處理Mapper寫出的keyout-valueout,
④OutPutFormat呼叫RecordWriter,將Reducer處理後的keyout-valueout寫出到檔案
⑦Partitioner: 分割槽器
分割槽器,負責在Mapper將資料寫出時,將keyout-valueout,為每組keyout-valueout打上標記,進行分割槽!
目的: 一個ReduceTask只會處理一個分割槽的資料!
Map階段(MapTask): 切片(Split)-----讀取資料(Read)-------交給Mapper處理(Map)------分割槽和排序(sort)
Reduce階段(ReduceTask): 拷貝資料(copy)------排序(sort)-----合併(reduce)-----寫出(write)
相關文章
- Hadoop框架:MapReduce基本原理和入門案例Hadoop框架
- ODPS MapReduce入門
- Pig安裝及入門案例
- (CMake):CMake安裝及快速入門案例
- Hadoop 專欄 - MapReduce 入門Hadoop
- MapReduce執行流程
- MapReduce工作流程
- Hadoop之MapReduce2基礎梳理及案例Hadoop
- kafka入門案例Kafka
- RabbitMQ入門案例MQ
- vuex入門案例Vue
- MapReduce(一):入門級程式wordcount及其分析
- MapReduce程式執行流程
- Python入門(案例)Python
- 前端-vue入門案例前端Vue
- CSS入門案例:摺扇CSS
- jQuery入門(四)案例jQuery
- FineBI入門案例分析
- 大資料入門:MapReduce基本原理大資料
- MapReduce的執行流程概述
- MapReduce流程分析(R1)
- MapReduce工作原理流程簡介
- 使用MapReduce執行WordCount案例
- RabbitMQ 入門案例 - fanout 模式MQ模式
- spring 01 入門案例Spring
- Flask服務入門案例Flask
- Vue入門——Vue的核心Vue
- Java入門-核心機制Java
- MapReduce環境搭建以及WordCount案例
- MapReduce應用案例--簡單排序排序
- HDFS+MapReduce+Hive+HBase十分鐘快速入門Hive
- Mermaid 流程圖入門AI流程圖
- Visio 畫流程圖 入門流程圖
- msysgit——Git bash 入門操作流程Git
- 入門須知之網路爬蟲的基本流程及抓取策略爬蟲
- 產品經理新手入門必備:實戰流程及方法論
- webpack 入門之 loader 案例Web
- Spring Cloud Gateway 入門案例SpringCloudGateway