Hadoop系列之四:MapReduce進階

版權聲明:原創做品,如需轉載,請與做者聯繫。不然將追究法律責任。程序員


一、mapper和reducer算法

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的專用組件負責,後文對此會有進一步闡述。  編程


 單reduce任務的MapReduce數據流
圖像來源:hadoop the definitive guide 3rd edition

安全

 多reduce任務的MapReduce數據流
圖像來源:hadoop the definitive guide 3rd edition
數據結構

mapper和reducer能夠直接在各自接收的數據上執行所須要的操做,然而,當使用到外部資源時,多個mapper或reducer之間可能會產生資源競爭,這勢必致使其性能降低,所以,程序員必須關注其所用資源的競爭條件並加入適當處理。其次,mapper輸出的中間鍵值對與接受的鍵值對能夠是不一樣的數據類型,相似地,reducer輸出的鍵值對與其接收的中間鍵值對也能夠是不一樣的數據類型,這可能會給編程過程及程序運行中的故障排除帶來困難,但這也正是MapReduce強大功能的體現之一。 併發

除了常規的兩階段MapReduce處理流外,其還有一些變化形式。好比將mapper輸出的結果直接保存至磁盤中(每一個mapper對應一個文件)的沒有reducerMapReduce做業,不過僅有reducer而沒有mapper的做業是不容許的。不過,就算用不着reducer處理具體的操做,利用reducermapper的輸出結果進行從新分組和排序後進行輸出也能以另外一種形式提供的完整MapReduce模式。

app

沒有reducerMapReduce做業
圖像來源:hadoop the definitive guide 3rd edition分佈式

MapReduce做業通常是經過HDFS讀取和保存數據,但它也能夠使用其它知足MapReduce應用的數據源或數據存儲,好比Google的MapReduce實現中使用了Bigtable來完成數據的讀入或輸出。BigTable屬於非關係的數據庫,它是一個稀疏的、分佈式的、持久化存儲的多維度排序Map,其設計目的是可靠的處理PB級別的數據,而且可以部署到上千臺機器上。在Hadoop中有一個相似的實現HBase可用於爲MapReduce提供數據源和數據存儲。這些內容在後文中會有詳細介紹。


參考文獻:
Data-Intensive Text Processing with MapReduce
Hadoop The Definitive Guide 3rd edtion
Apache Hadoop Documentation
ide

本文出自 「馬哥教育Linux」 博客,轉載請與做者聯繫!

相關文章
相關標籤/搜索