文章目錄
Hadoop之MapReduce重點架構原理
一、MapReduce概念
二、MapReduce 編程思想
2.1、Map階段
2.2、Reduce階段
三、MapReduce處理數據流程
四、MapReduce Shuffle
五、MapReduce注意點
六、MapReduce的三次排序
Hadoop之MapReduce重點架構原理
一、MapReduce概念
MapReduce是Hadoop生態中的計算框架,用于大規模數據集的并行計算。
二、MapReduce 編程思想
2.1、Map階段
在Map階段中,輸入數據被分割成若干個獨立的塊,并由多個Mapper任務并行處理,每個Mapper任務都會執行用戶定義的map函數,將輸入數據轉換成一系列鍵-值對的形式(Key-Value Pairs),這些鍵-值對被中間存儲,以供Reduce階段使用。
Map階段主要是對數據進行映射變換,讀取一條數據可以返回一條或者多條K,V格式數據。
2.2、Reduce階段
在Reduce階段中,所有具有相同鍵的鍵-值對會被分配到同一個Reducer任務上,Reducer任務會執行用戶定義的reduce函數,對相同鍵的值進行聚合、匯總或其他操作,生成最終的輸出結果,Reduce階段也可以由多個Reduce Task并行執行。
Reduce階段主要對相同key的數據進行聚合,最終對相同key的數據生成一個結果,最終寫出到磁盤文件中。
三、MapReduce處理數據流程
-
首先MapReduce會將處理的數據集劃分成多個split,split劃分是邏輯上進行劃分,而非物理上的切分,每個split默認與Block塊大小相同,每個split由1個map task進行處理。
-
map task以行為單位讀取split中的數據,將數據轉換成K,V格式數據,根據Key計算出本條數據應該寫出的分區號,最終在內部得到(K,V,P)格式數據寫入到當前map task 所在的物理節點磁盤,便于后續reduce task的處理。
-
為了避免每條數據都產生一次IO,MapReduce 引入了“環形緩沖區”內存數據結構,默認大小100M。先將處理好的每條數據寫入到“環形緩沖區”,當環形緩沖區使用達到80%時,會將數據溢寫到磁盤文件。根據split大小不同,可能會發生多次溢寫磁盤過程。
-
每次溢寫磁盤時會對數據進行二次排序:按照數據(K,V,P)中的P(分區)進行排序并在每個P(分區)中按照K進行排序,這樣能保證相同的分區數據放在一起并能保證每個分區內的數據按照key有序。
-
最終多次溢寫的磁盤文件數據會根據歸并排序算法合并成一個完整的磁盤文件,此刻,該磁盤文件特點是分區有序且分區內部數據按照key有序。
-
Reduce端每個Reduce task會從每個map task所在的節點上拉取落地的磁盤文件對應的分區數據,對于每個Reduce task來說,從各個節點上拉取到多個分區數據后,每個分區內的數據按照key分組有序,但是總體來看這些分區文件中key數據不是全局有序狀態(分區數據內部有序,外部無序)。
-
每個Reduce task需要再通過一次歸并排序進行數據merge,將每個分區內的數據變成分區內按照key有序狀態,然后通過Reduce task處理將結果寫出到HDFS磁盤。
四、MapReduce Shuffle
-
分區(Partitioning):根據鍵值對的鍵,將中間鍵值對劃分到不同的分區。每個分區對應一個Reduce任務,這樣可以確保相同鍵的鍵值對被發送到同一個Reduce任務上進行處理。
-
排序(Sorting):對每個分區內的中間鍵值對按鍵進行排序(快排)。通過排序,相同鍵的鍵值對會相鄰存放,以便后續的合并操作更高效。
-
合并(Merging):對多次溢寫的結果按照分區進行歸并排序合并溢寫文件,每個maptask最終形成一個磁盤一些文件,減少后續Reduce階段的輸入數據量。
-
Combiner(局部合并器):Combiner是一個可選的優化步驟,在Map任務輸出結果后、Reduce輸入前執行。其作用是對Map任務的輸出進行局部合并,將具有相同鍵的鍵值對合并為一個,以減少需要傳輸到Reduce節點的數據量,降低網絡開銷,并提高整體性能。Combiner實際上是一種輕量級的Reduce操作,用于減少數據在網絡傳輸過程中的負擔。需要注意的是,Combiner的執行并不是強制的,而是由開發人員根據具體情況決定是否使用。
-
拷貝(Copying):將各分區內的數據復制到各自對應的Reduce任務節點上,會先向內存緩沖區中存放數據,內存不夠再溢寫磁盤,當所有數據復制完畢后,Reduce Task統一對內存和磁盤數據進行歸并排序并交由Redcue方法并行處理。
五、MapReduce注意點
-
MapReduce Job 中Map Task并行度由split切片決定。
-
Split切片默認與一個block大小相等,block是物理切分,split是邏輯切分,也就是說split大小是通過offset范圍來決定每個split大小,而非真正的文件切分。
-
讀取數據源時,如果數據源頭包括多個文件,會針對每個文件單獨進行split切片,而不會考慮數據整體。
六、MapReduce的三次排序
-
第一次排序發生在Map階段的磁盤溢寫時:當MapReduce的環形緩沖區達到溢寫閾值時,在數據刷寫到磁盤之前,會對數據按照key的字典序進行快速排序,以確保每個分區內的數據有序。
-
第二次排序發生在多個溢寫磁盤小文件合并的過程中:經過多次溢寫后,Map端會生成多個磁盤文件,這些文件會被合并成一個分區有序且內部數據有序的輸出文件,從而確保輸出文件整體有序。
-
第三次排序發生在Reduce端:Reduce任務在獲取來自多個Map任務輸出文件后,進行合并操作并通過歸并排序生成每個Reduce Task處理的分區文件整體有序。
- 📢博客主頁:https://lansonli.blog.csdn.net
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 Lansonli 原創,首發于 CSDN博客🙉
- 📢停下休息的時候不要忘了別人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活?