1. 程式人生 > >Hadoop系列之四:MapReduce進階

Hadoop系列之四:MapReduce進階


1、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對應一個檔案)的沒有reducer的MapReduce作業,不過僅有reducer而沒有mapper的作業是不允許的。不過,就算用不著reducer處理具體的操作,利用reducer將mapper的輸出結果進行重新分組和排序後進行輸出也能以另一種形式提供的完整MapReduce模式。

沒有reducer的MapReduce作業
影象來源: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

本文出自 “馬哥教育Linux運維” 部落格,轉載請與作者聯絡!