Hadoop體系結構之 Mapreduce
MR框架是由一個單獨運行在主節點上的JobTracker和運行在每個集群從節點上的TaskTracker共同組成。主節點負責調度構成一個作業的所有任務,這些任務分布在不同的不同的從節點上。主節點監視它們的執行情況,並重新執行之前失敗的任務。從節點僅負責由主節點指派的任務。當一個Job被提交時,JobTracker接受到提交作業和配置信息之後,就會將配置信息等分發給從節點,同時調度任務並監控TaskTracker的執行。JobTracker可以運行於集群中的任意一臺計算機上。TaskTracker負責執行任務,它必須運行在DataNode上,DataNode既是數據存儲節點,也是計算節點。JobTracker將map任務和reduce任務分發給空閑的TaskTracker,這些任務並行運行,並監控任務運行的情況。如果JobTracker出了故障,JobTracker會把任務轉交給另一個空閑的TaskTracker重新運行。
Hadoop上的並行應用程序開發是基於MR編程框架。MR編程模型原理:利用一個輸入的key-value對集合來產生一個輸出的key-value對集合。MR庫通過Map和Reduce兩個函數來實現這個框架。用戶自定義的map函數接受一個輸入的key-value對,然後產生一個中間的key-value對的集合。MR把所有具有相同的key值的value結合在一起,然後傳遞個reduce函數。Reduce函數接受key和相關的value結合,reduce函數合並這些value值,形成一個較小的value集合。通常我們通過一個叠代器把中間的value值提供給reduce函數(叠代器的作用就是收集這些value值),這樣就可以處理無法全部放在內存中的大量的value值集合了。
流程簡而言之,大數據集被分成眾多小的數據集塊,若幹個數據集被分在集群中的一個節點進行處理並產生中間結果。單節點上的任務,map函數一行行讀取數據獲得數據的(k1,v1),數據進入緩存,通過map函數執行map(基於key-value)排序(框架會對map的輸出進行排序)執行後輸入(k2,v2)。每一臺機器都執行同樣的操作。不同機器上的(k2,v2)通過merge排序的過程(shuffle的過程可以理解成reduce前的一個過程),最後reduce合並得到,(k3,v3),輸出到HDFS文件中。
談到reduce,在reduce之前,可以先對中間數據進行數據合並(Combine),即將中間有相同的key的<key,value>對合並。Combine的過程與reduce的過程類似,但Combine是作為map任務的一部分,在執行完map函數後僅接著執行。Combine能減少中間結果key-value對的數目,從而降低網絡流量。
Map任務的中間結果在做完Combine和Partition後,以文件的形式存於本地磁盤上。中間結果文件的位置會通知主控JobTracker,JobTracker再通知reduce任務到哪一個DataNode上去取中間結果。所有的map任務產生的中間結果均按其key值按hash函數劃分成R份,R個reduce任務各自負責一段key區間。每個reduce需要向許多個map任務節點取的落在其負責的key區間內的中間結果,然後執行reduce函數,最後形成一個最終結果。有R個reduce任務,就會有R個最終結果,很多情況下這R個最終結果並不需要合並成一個最終結果,因為這R個最終結果可以作為另一個計算任務的輸入,開始另一個並行計算任務。這就形成了上面圖中多個輸出數據片段(HDFS副本)。
source: 總結於網絡。
Hadoop體系結構之 Mapreduce