我不喜歡照搬書上的東西,我以爲那樣寫個blog沒多大意義,不如直接把那本書那一頁告訴你們,來得省事。我喜歡將我本身的理解。因此我會說說我對於Hadoop對大量數據進行處理的理解。若是有理解不對歡迎批評指責,不勝感激。框架
Hadoop之因此能處理大量數據,是由於他提供了一個讓大量機器同時處理問題的一個框架,並且高擴展性,能夠隨時添加機器進來。我曾經和學長討論過Hadoop和高性能計算機,當時我說這個就像,小白對陣大俠,大俠是高性能計算,小白是普通機器。大俠只有一個,小白卻能有千千萬萬。一個小白確定拼不過大俠,上十個小白,百個小白……早晚小白會超過大俠。那麼如何讓一羣性能不是很強勁的電腦結合起來,產生驚人的處理能力呢?就是經過Hadoop系統來實現。oop
Hadoop的文件系統,對於節點管理,最終仍是爲了進行運算。因此其中最主要的運算核心仍是MapReduce。有些書上會吧Map和Reduce翻譯過來說,我以爲很生硬,不如直接用英文來的好。不翻譯過來的前提要明白Map和Reduce的內在含義。Map原意是地圖,計算機上多爲映射,怎麼個映射法?其實就是某個鍵值對映射到固定的reduce。那reduce又是什麼,開始我也不明白,爲何不用compute了?後來算是明白了,其實reduce是對數據集進行精簡,而後得出相應結果。因此叫reduce減小的意思,有翻譯爲歸併。性能
當咱們手中有大量數據的時候,如何對數據進行處理,好比去重,排序等甚至更加複雜的處理呢?咱們又要如何來用多臺機器對數據進行處理?spa
要是我,我確定會將大量的數據進行分類,同一類的數據集給同一臺機器來處理。怎麼分?怎麼處理呢?這就須要看到底要對數據作那些處理了。翻譯
而這種先分類後處理的想法就是MapReduce的過程。其中分類的具體過程在mapreduce結構中稱爲shuffle,下面講解mapreduce的過程當中會包涵在其中,但不會單獨提出來說。blog
若是不對數據分類,意味着不能用多臺機器對數據進行處理,由於會出現機器處理的數據之間存在某些重要的聯繫,這些聯繫決定了這類數據必定要在同一臺機器上運行。因此,運算前對數據進行分類是必要的準備。也就是Map的過程,將有聯繫的數據分到一塊兒,而後交給相應的reduce作處理。Reduce是對數據進行最終目的性的處理。排序
首先對大量的數據進行簡單的分割,以下圖所示,每個split的大小多是64M也多是128M其大小是由硬盤傳輸速度決定的。it
、io
圖1.HDFS對大量數據進行分塊容器
對於每一個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的partition移動到本地來。而後進行排序最後成爲reduce 的運算數據。Reduce纔是真正對數據進行相應的處理產生最終結果。在map和reduce有一個環節—shuffle。我已經融合在了上面說介紹的步驟裏面了。Shuffle指的就是數據經過map進行初步處理後,將同一類的數據分發給同一個reduce。
圖3.map+reduce過程