版權聲明:原創做品,如需轉載,請與做者聯繫。不然將追究法律責任。程序員
MapReduce對數據的處理分爲兩個階段:map階段和reduce階段,這兩個階段分別由用戶開發的map函數和reduce函數完成,在MapReduce運行環境中運行時,它們也分別被稱爲mapper和reducer。鍵值對(key-value pair)是MapReduce的基礎數據結構,mapper和reducer讀入和輸出的數據均爲鍵值對。MapReduce中,「鍵」和「值」能夠是基礎類型數據,如整數、浮點數、字符串或未經加工的字節數據,也能夠是任意形式的複雜數據類型。程序員能夠自行定義所需的數據類型,也可藉助於Protocol Buffer、Thrift或Avro提供的便捷方式完成此類工做。 MapReduce算法設計的工做之一就是在給定數據集上定義「鍵-值」數據結構,好比在搜索引擎蒐集、存儲網頁類工做中,key能夠使用URL來表示,而value則是網頁的內容。而在有些算法中,Key也能夠是沒有任何實際意義的數據,其在數據處理過程當中可被安全忽略。在MapReduce中,程序員須要基於以下方式定義mapper和reducer: map: (k1,v1)-->[(k2,v2)] reduce: (k2,[v2])-->[(k3,v3)] 其中[...]表示其多是一個列表。這些傳遞給MapReduce進行處理的數據能夠存儲於分佈式文件系統上,mapper操做將應用於每個傳遞過來的「鍵-值」對並生成必定數量的「中間鍵值對(intermediate key-value)」,然後reduce操做將應用於這些中間鍵值對並於處理後輸出最終的鍵值對。 另外,mapper操做和reducer操做之間還隱含着一個應用於中間鍵值對的「分組」操做,同一個鍵的鍵值對須要被歸類至同一組中併發送至同一個reducer,而傳送給每一個reducer的分組中的鍵值對是基於鍵進行排序後的列表。reducer生成的結果將會保存至分佈式文件系統,並存儲爲一個或多個以r(即reducer號碼)結尾的文件,但mapper生成的中間鍵值對數據則不會被保存。數據庫
MapReduce在大數據處理時,會根據要處理的數據文件及用戶編寫的map函數首先將數據分割爲多個部分(split),然後爲每個split啓動一個map任務(map task,即map進程),這些map任務由MapReduce運行環境調度着分散運行於集羣中的一個或多個節點上;每一個mapper執行結束後,均可能會輸出許多的鍵值對,稱做中間鍵值對,這些中間鍵值對臨時性地存放在某位置,直到全部的mapper都執行結束;然後MapReduce把這些中間鍵值對從新進行分割爲一個或多個分組,分組的標準是鍵相同的全部鍵值對都要排序後納入同一個組中,同一個組能夠包含一個或多個鍵及其對應的數據,MapReduce運行環境會爲每個分組啓動一個reduce任務 (reduce task),這些reduce任務由MapReduce運行環境調度着運行於集羣中的一個或多個節點上。 事實上,中間鍵值對分組的功能由一個稱做partitioner的專用組件負責,後文對此會有進一步闡述。 編程
mapper和reducer能夠直接在各自接收的數據上執行所須要的操做,然而,當使用到外部資源時,多個mapper或reducer之間可能會產生資源競爭,這勢必致使其性能降低,所以,程序員必須關注其所用資源的競爭條件並加入適當處理。其次,mapper輸出的中間鍵值對與接受的鍵值對能夠是不一樣的數據類型,相似地,reducer輸出的鍵值對與其接收的中間鍵值對也能夠是不一樣的數據類型,這可能會給編程過程及程序運行中的故障排除帶來困難,但這也正是MapReduce強大功能的體現之一。 併發