MapReduce基礎(學習筆記)
1、簡介
MapReduce是一個用於處理海量資料的分散式計算框架。這個框架解決了:
1.資料分散式儲存
上一篇文章提到MapReduce自身是不儲存資料的,資料都存取在HDFS上,計算的目標資料就是來自於HDFS。
2.作業排程
一個Hadoop叢集上可以跑很多個MapReduce,不可能某一個MapReduce佔了所有資源,資源是共享的。
3.容錯
非個人因素導致的問題比如網路堵塞、機器間通訊等複雜問題,會自動切換到其他節點上。
2、MapReduce分而治之思想
1、數錢例項:一堆鈔票,各種面值分別多少
-單點策略
- 一個人數所有的鈔票,數出各種面值有多少張
-分治策略
- 每個人分得一堆鈔票,數出各種面值有多少種
- 彙總,每個人負責統計一種面值
2、解決資料可以切割進行計算的應用
- 分治思想
-分解
-求解
-合併
- MapReduce對映
-分:map
把複雜的問題分解為若干“簡單的任務”
-合:reduce
3、MapReduce計算框架·執行流程(重點)
開發人員一般情況下需要關心的是圖中灰色的部分。↑
Map和Reduce部分細節化↓:
Map部分:
一個map實際上對應一個split分片,首先map讀取split,因為map是一個程式,作為系統裡面的一個程序,自己維護著一個程序空間。把split資料讀進來之後直接存到了自己的記憶體上(buffer in memory),然後開始往記憶體寫。記憶體預設大小為100M,但是100M很容易寫滿,當它寫到80M的時候會鎖住記憶體區,然後把這80%的資料轉儲到磁碟上,然後清理記憶體。轉儲的過程中會作排序(sort),圖中partitions中三個部分相當於前面數錢的例子中面值的分類。三個小的資料部分再歸併排序成大的資料(merge on disk)。途中只展示出一個Map的執行流程,還有other maps。
Reduce部分
還是數錢的例子,假設圖中Reduce部分是負責處理一百元面值的,把每個Map上屬於一百元區域的資料通過fetch紅線全部歸納到Reduce機器上(相當於拷貝)。然後把從每個從Map拷貝過來的資料兩兩合併,再統一交給Reduce處理,最後輸出。
4、兩個重要的程序
-JobTracker
- 主程序,負責接收客戶作業提交,排程任務到作節點上執行,並提供諸如監控工作節點狀態及任務進度等管理功能,一個MapReduce叢集有一個JobTracker,一般執行在可靠的硬體上。
- TaskTracker是通過週期性的心跳來通知JobTracker其當前的健康狀態,每一次心跳包含了可用的Map和Reduce任務數目、佔用的數目以及執行中的任務詳細資訊。JobTracker利用一個執行緒池來同時處理心跳和客戶請求。
-TaskTracker
- 由JobTracker指派任務,例項化使用者程式,在本地執行任務並週期性地向JobTracker彙報狀態。在每一個工作節點上永遠只會有一個TaskTracker。
-JobTracker一直在等待使用者提交作業
-TaskTracker每隔3秒向JobTracker傳送心跳詢問有沒有任務可做,如果有,讓其派發任務給它執行
-Slave主動向Master拉生意