在hadoop2.x大行其道的年代,其優秀的資源管理框架(系統),高可用的分布式儲存系統,備受企業青睞。然因上述之惑,往往不能盡得其中之深意。此篇部落格筆者為大家一一解惑。
雖說我們能夠編寫乙個完成mapreduce程式,並執行它。然其執行的細節,我們卻未必清楚,往往初學者在編寫乙個mapreduce作業時,遇到錯誤而不去研究分析其錯誤之根本,轉而求助於搜尋引擎,在搜尋無望之下,會讓自己瞬間懵逼,不知所措。
這裡,我們去剖析其計算模型的執行細節,雖不敢說剖析之後能解決所有的疑難雜症,但起碼能讓我們知曉錯誤原因,能夠找到解決問題的方向,繼而解決我們所遇之難題。下面為大家剖析mapreduce的計算模型。
map階段,簡言之:
reduce階段,簡言之:
上述為其計算模型的執行過程,需有幾點要額外注意。這裡有些階段,我們在編寫相關應用時,需有謹慎。
這裡有乙個combine階段,這個階段的使用有助與我們對mapreduce的效能進行優化,為何這麼說?細細剖析該過程便可明白。在map 函式時,它只管處理資料,並不負責統計處理資料的結果,也就是說並沒有combine階段,那麼,問題來了,在reduce過程當中,因為每個map函式 處理後的資料沒有統計,它除了要統計所有map的彙總數量,還要統計單個map下的處理數。也許,這裡有點繞,大家可以參照下圖來理解這層意思,如下圖所 示:
然而,這樣是不行的,所以reduce為了減輕壓力,每個map都必須統計自己旗下任務處理結果,即:combine。這樣,reduce所做 的事情就是統計每個map統計之後的結果,這樣子就會輕鬆許多。因而,combine在map所做的事情,減輕了reduce的事情,省略了上圖中的步驟 1。
具體**細節,可在job的屬性方法中設定對應的引數,如下所示:
job.setcombinerclass(defreducer.class);
另外,我們也有必要理解partition相關職責,它是分割map節點的結果,按照key分別對映給不同的reduce,這裡我們可以理解為歸類,對一些複雜的資料進行歸類。在job屬性中設定對應的分割槽類,那麼你的分割槽函式就生效了,如下所示:
job.setpartitionerclass(defpartition.class);
在hadoop2.x中,由於有了yarn來做資源管理,因而第二代mapreduce的執行環境,對比第一代mapreduce有了些許的改變。具體改變細節,可參考我寫的另一篇部落格:《mapreduce執行環境剖析》。
本篇部落格給大家剖析了mapreduce的計算模型和執行環境,其中計算模型不變,變者乃其執行環境。所變內容,簡言之:rm下包含am和 nm,nm會rm申請container(其可理解為乙個執行時的jvm),nm與rm的通訊屬於「pull模型」,即nm主動上報狀態資訊,rm被動接 受上報資訊。
MapReduce 深度剖析
mapreduce 深度剖析 在hadoop2.x大行其道的年代,其優秀的資源管理框架 系統 高可用的分布式儲存系統,備受企業青睞。然因上述之惑,往往不能盡得其中之深意。此篇部落格筆者為大家一一解惑。雖說我們能夠編寫乙個完成mapreduce程式,並執行它。然其執行的細節,我們卻未必清楚,往往初學者...
ifdef cplusplus深度剖析
時常在cpp的 之中看到這樣的 ifdef cplusplus extern c endif 這樣的 到底是什麼意思呢?首先,cplusplus是cpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的 也就是說,上面的 的含義是 如果這是一段cpp的 那麼加入extern c 處理其中的 ...
深度剖析ostream
雖然c 學了大半個月了,自己學了解了很多關於c 的知識,大的概念懂了不少,但是還是想說想要徹底的弄懂c 絕非易事。當別人問到乙個很小的知識點些許你都要愣很久,事實告訴我們不能太好高騖遠。為什麼要寫ostream而不是istream,因為當我們自定義型別 student類 的時候,如果需要輸出 stu...