MapReduce這樣的工作機制,你也可以Get到

MapReduce 程序員 文章 Java 技術妞妞 2017-06-14

上一篇文章的結尾留下了一個疑問,Map-Reduce是如何解決數據負載和數據均衡問題的?今天的這篇文章將給出答案。MapReduce是一種移動計算但不移動數據的計算框架,所謂的移動計算其實還拷貝程序而不拷貝數據,在整個集群中,文件已經以數據塊的大小存儲在集群中的節點上,MapReduce操作的則是這些具備高可用,高容錯性的數據塊。

我們對應下圖來大體的說明一下MapReduce的工作機制,數據塊存儲在HDFS的DataNode上,MapReduce其實就可以理解為兩個java程序,它們接收到一個數據塊,首先劃分為split,也就是分片處理,一個map進程處理一個split,這裡無論是map程序還是reduce程序必須保證兩個函數都是以鍵值對作為輸入和輸出,程序員需要自行編寫map和reduce兩個函數。

MapReduce這樣的工作機制,你也可以Get到

然後對map函數處理過的結果中的Key值按照字典進行排序,在sort這一部分還包括了分區、溢寫以及Combiner操作,從下圖中可以詳細看到MapReduce的內部數據處理、整合以及傳遞的過程。下圖是單獨拿出一個map進程和reduce進程的圖示,經過map處理得到的結果在map的緩衝區中,計算結果進行分區,這裡的分區可以用函數來定義怎麼分區,當map緩衝區放不下map的計算結果時,就會溢寫到磁盤中,並且同時進行Combiner操作,這裡的Combiner是把map輸出結果中key相同整合成一個大的存儲空間,為了減少向Reduce進程進行數據傳輸的消耗,從圖中可以看出map task 和reduce task的fetch過程。

MapReduce這樣的工作機制,你也可以Get到

這裡可以利用MapReduce的經典例子來解釋Map task都完成了哪些操作,下圖是一個統計文件中單詞個數的操作,輸入的上文件其中一個數據塊,劃分成了3個Split,Mapping 計算統計處了自己所處理的split的單詞個數,在Shuffling中就會進行分區、排序、溢寫以及Combiner的操作,比如在Mapping下第二個Mapping的處理結果Car 1 Car 1 River 1 就可以做Combiner操作,具備相同key的記錄整合成一個,變成Car 2再溢寫到磁盤上。

MapReduce這樣的工作機制,你也可以Get到

回到我們在開篇提到的那個問題,對於MapReduce能解決數據傾斜的問題,首先明確數據傾斜是怎樣發生的,數據傾斜的發生指的是在集群中有的節點需要處理大量的數據,而有的結果則只會處理很少的數據,這樣就發生了數據傾斜。而其實上解決數據傾斜最關鍵的一步則是Partition分區過程,下面我們通過了解Partition過程來了解分區是如何解決數據傾斜問題的。

MapReduce這樣的工作機制,你也可以Get到

Partition過程是可以由程序員編寫代碼來控制的,也就是說我們的代碼採用的分區策略會影響解決數據傾斜問題的效果。舉個栗子,假設我們利用%2來分區,那麼只會有0或者1兩種結果,這兩種結果就會對應兩個分區,所有的map 處理後的結果都採用相同的分區策略,也就是說不同的map輸出的結果經過分區、排序、Combiner等操作後可能傳遞到同一個reduce進程上來處理,這是因為分區0對應著處理分區0的reduce進程,分區1對應著處理分區1的reduce進程。而reduce的個數則有用戶需求來決定,需要多個輸出結果則設置多個reduce task,數據少則設置比較少的reduce task。最終輸出的Reduce則整合結果,最終輸出。

看完這篇文章你基本瞭解MapReduce的工作機制了麼?歡迎扔鞋底~

相關推薦

推薦中...