實戰錄 | Hadoop Mapreduce shuffle之Combine探討

《實戰錄》導語

雲端衛士工程師朱震華之前一直從事業務MR的開發,他說一直覺得這是大數據開發中最low的技術。但是,要真正搞清MR的具體實現細節,其實也不簡單哦,今天就來簡單說說combine的問題。 大牛們請輕噴。


一、Hadoop


若干年前,google發佈了三篇論文,分別對應google fs,mapreduce,和bigtable。震驚了全世界。由Doug Cutting領銜的技術大牛們,對其進行了開源實現,這就是hadoop的由來。hadoop也因此成爲了大數據的代名詞,在長達數十年內一直成爲大數據領域內最火的技術,沒有之一,並且由hadoop引申出來的其他一些技術,如,hive,pig,mahout,等也迅速發展壯大起來,形成了整個hadoop生態圈。近年來,spark以其內存計算,迭代處理計算,成爲雲計算領域的繼Hadoop之後的下一代的最熱門的通用的並行計算框架開源項目,不過不在本文的探討範圍內哦。


二、Hadoop MapReduce


Hadoop作爲大數據解決方案的首選,其核心技術分爲,hdfs和mapreduce。hdfs是分佈式文件系統,提供數據的存儲。mapreduce是一種並行計算的框架。核心思想是“分而治之”,舉個簡單的例子,一個人去沙灘淘金要淘N天,那麼N個人一起去淘的話,可能就只需要一天了哦。對應到hadoop中,一臺機器要做的事情,現在交給N臺機器去做,那麼,速度自然就是原來的N倍啦,不過,實際情況,肯定達不到N倍,分佈式系統,不是簡單的相加那麼簡單,具體還和每臺機器的性能,數據的最終合併,等其他多種因素有關哦,這邊不做詳細探討。


作爲Mapreduce開發人員,我們只需要實現map方法(分)和reduce方法(合)就可以實現業務,其實框架隱藏了很多實現,幫我們做了很多事情哦。瞭解內部的實現機制,還是有必要的。


三、Combine


Hadoop一般是做離線數據分析,數據存儲在HDFS上,以block的形式存儲(默認一個block爲64M,hadoop1.x),mapreduce程序運行的時候,一個loock默認對應一個map任務,而map方法具體對每一行數據進行處理,map處理完之後,reduce負責把每個map處理完的結果進行彙總,得到最終輸出。


那麼問題來了,從map的輸出到reduce的輸入,這中間hadoop究竟爲我們做了什麼?這就是mapreduce裏面最核心的過程,shuffle。這裏我簡單講一下自己的理解,書上可能講的不是很清晰。


shuffle過程:




【1】每一個map任務完成之後,會根據Key進行分區,確定它之後由哪個reduce進行處理(默認是hash分區,也可以自定義分區方法),然後寫入對應的內存緩衝區
【2】當內存緩衝區數據量達到一定值的時候,會flush到本地磁盤哦(溢寫過程)
【3】如果數據量比較大,或者單節點map任務比較多,或者分區比較多,會在本地磁盤生成多個文件,當所有map任務全部跑完之後,這些本地磁盤的文件,會進行一次合併,生成最終的map輸出文件
【4】reduce端會啓動多個http線程去對應的節點拷貝它需要處理的數據,先將數據緩存至內存中,當數據量不斷增大,也會有一個溢寫的過程
【5】如果溢寫多個文件,那麼也會進行合併生成最終文件,作爲reduce的輸入


shuffle過程中還有一些排序的過程,這裏我沒有進行說明(其實是我自己不是很清楚,哈哈)。有興趣的可以自己去了解哦。


combine被稱作是map端的reduce,其作用是對map端的數據進行合併,邏輯一般與reduce類似,可以減少網絡上傳輸的數據量,提高帶寬的利用率。因爲hadoop很大一部分瓶頸是在網絡帶寬方面。那麼combine究竟什麼時候會執行,編寫combine類又需要注意些什麼呢?


我原來一直以爲,combine只會在map端執行一次。直到某一天,某個同事的mapreduce程序數據出現了錯亂,找了好幾天都沒找到錯誤,後來才發現,是因爲combine輸出了多種數據格式,combine的數據與map輸出不同,且邏輯也不同。導致了數據錯亂,那麼,爲什麼會錯亂呢?


於是,打開mapreduce源碼,去找combine被調用的代碼。




這是一個map任務溢寫的源碼,第9行,如果沒有定義combine,則map直接寫文件,如果定義了combine,在35行,會執行combine操作。


再來看merge過程。



13-17行,如果定義了combine,會再次被調用。


至於在reduce端,在spill後的merge過程中,也會再次調用combine。有興趣的朋友可以自己去看哦。


由於combine會被多次調用,所以,combine的存在,會使數據質量更高,善用combine能使mapreduce程序性能更好。


四、總結


Combine是mapreduce中很重要的一個環節,合理的使用combine能減少數據量.有人說,不寫combine的mapreduce不是一個好的mapreduce。但是,並不是所有的mapreduce程序都適合用combine,求和運算可以使用combine提高性能,但是求平均值用combine就會導致錯誤的結果。所以,也不可盲目的使用combine,具體問題具體分析。另外,如果設定了combine,它會在多處被執行。所以,應儘量保持,combine邏輯與reduce大致相同,combine的輸出也應與map的輸出儘量保持一致,防止,產生錯誤的結果。好了,combine就先說到這裏了。


發佈了44 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章