我不喜歡照搬書上的東西,我覺得那樣寫個blog沒多大意義,不如直接把那本書那一頁告訴大家,來得省事。我喜歡將我自己的理解。所以我會說說我對於Hadoop對大量數據進行處理的理解。如果有理解不對歡迎批評指責,不勝感激。
Hadoop為何有如此能耐?
Hadoop之所以能處理大量數據,是因為他提供了一個讓大量機器同時處理問題的一個框架,而且高擴展性,可以隨時添加機器進來。我曾經和學長討論過Hadoop和高性能計算機,當時我說這個就像,小白對陣大俠,大俠是高性能計算,小白是普通機器。大俠只有一個,小白卻能有千千萬萬。一個小白肯定拼不過大俠,上十個小白,百個小白……遲早小白會超過大俠。那么如何讓一群性能不是很強勁的電腦結合起來,產生驚人的處理能力呢?就是通過Hadoop系統來實現。
什么是MapReduce
Hadoop的文件系統,對於節點管理,最終還是為了進行運算。所以其中最主要的運算核心還是MapReduce。有些書上會吧Map和Reduce翻譯過來講,我覺得很生硬,不如直接用英文來的好。不翻譯過來的前提要明白Map和Reduce的內在含義。Map原意是地圖,計算機上多為映射,怎么個映射法?其實就是某個鍵值對映射到固定的reduce。那reduce又是什么,開始我也不明白,為什么不用compute了?后來算是明白了,其實reduce是對數據集進行精簡,然后得出相應結果。所以叫reduce減少的意思,有翻譯為歸並。
為什么提出Map和Reduce
當我們手中有大量數據的時候,如何對數據進行處理,比如去重,排序等甚至更加復雜的處理呢?我們又要如何來用多台機器對數據進行處理?
要是我,我肯定會將大量的數據進行分類,同一類的數據集給同一台機器來處理。怎么分?怎么處理呢?這就需要看到底要對數據做那些處理了。
而這種先分類后處理的想法就是MapReduce的過程。其中分類的具體過程在mapreduce結構中稱為shuffle,下面講解mapreduce的過程中會包涵在其中,但不會單獨提出來講。
如果不對數據分類,意味着不能用多台機器對數據進行處理,因為會出現機器處理的數據之間存在某些重要的聯系,這些聯系決定了這類數據一定要在同一台機器上運行。所以,運算前對數據進行分類是必要的准備。也就是Map的過程,將有聯系的數據分到一起,然后交給相應的reduce做處理。Reduce是對數據進行最終目的性的處理。
MapReduce的細節處理
首先對大量的數據進行簡單的分割,如下圖所示,每一個split的大小可能是64M也可能是128M其大小是由硬盤傳輸速度決定的。
、
圖1.HDFS對大量數據進行分塊
Map過程
對於每個split交給一個map來處理。過程如下。Map的輸入是split里面的一行,key為偏移量,value就是該行的內容。處理的結果放入一個容器中,容器填滿了就溢出到硬盤,溢出的過程會對數據進行partition和sort。Sort很容易理解,關鍵是partition,partition也就是前面說的分類,這一部最終決定該鍵值對未來會交給哪個reduce。但所有map運行完了,就會有一堆spill。當然在map的過程中reduce的准備階段以及開始,reduce的准備階段就是把本reduce對應的partition移動到本地來。但要進行reduce操作一定要等所有map結束,屬於本reduce的partition全部移到本地,然后真正進入reduce階段。
圖2.Map過程
Reduce 階段
首先數據准備,也就是上面說的,將屬於本reduce的partition移動到本地來。然后進行排序最后成為reduce 的運算數據。Reduce才是真正對數據進行相應的處理產生最終結果。在map和reduce有一個環節—shuffle。我已經融合在了上面說介紹的步驟里面了。Shuffle指的就是數據通過map進行初步處理后,將同一類的數據分發給同一個reduce。
圖3.map+reduce過程