淺析Hadoop MapReduce架構

1 概述

1.1 目的

初步瞭解hadoop,初步掌握hadoop環境的部署方法。

1.2 基本概念

hadoop的核心主要包含:HDFS和MapReduce

HDFS是分佈式文件系統,用於分佈式存儲海量數據。

MapReduce是分佈式數據處理模型,本質是並行處理

2 基本概念

2.1 HDFS

http://blog.csdn.net/lfsf802/article/details/8978260

2.1.1 HDFS是什麼?

HADOOP DISTRIBUTED FILE SYSTEM,簡稱HDFS,是一個分佈式文件系統。它是谷歌的GFS提出之後出現的另外一種文件系統。它有一定高度的容錯性,而且提供了高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS 提供了一個高度容錯性和高吞吐量的海量數據存儲解決方案。

在最初,HADOOP是作為Apache Nutch搜索引擎項目的基礎架構而開發的,後來由於它獨有的特性,讓它成為HADOOP CORE項目的一部分。

2.1.2 HDFS的設計思路?

是什麼提供它高吞吐量的數據訪問和適合大規模數據集的應用的特性呢,這就要說一下它的設計思路。

首先HDFS的設計之初就是針對超大文件的存儲的,小文件不會提高訪問和存儲速度,反而會降低;其次它採用了最高效的訪問模式,也就是經常所說的流式數據訪問,特點就是一次寫入多次讀取;再有就是它運行在普通的硬件之上的,即使硬件故障,也就通過容錯來保證數據的高可用。

2.1.3 HDFS的一些概念

Block:大文件的存儲會被分割為多個block進行存儲。默認為64MB,每一個blok會在多個datanode上存儲多份副本,默認為3份。[這些設置都能夠通過配置文件進行更改]

Namenode:主要負責存儲一些metadata信息,主要包括文件目錄、block和文件對應關係,以及block和datanote的對應關係

Datanode:負責存儲數據,上面我們所說的高度的容錯性大部分在datanode上實現的[還有一部分容錯性是體現在namenode和secondname,還有jobtracker的容錯等]。

2.1.4 HDFS的基礎架構圖

淺析Hadoop MapReduce架構

HDFS的基礎架構圖

2.1.5 解析HDFS帶來的好處

高吞吐量訪問:HDFS的每個block分佈在不同的rack上,在用戶訪問時,HDFS會計算使用最近和訪問量最小的服務器給用戶提供。由於block在不同的rack上都有備份,所以不再是單數據訪問,所以速度和效率是非常快的。另外HDFS可以並行從服務器集群中讀寫,增加了文件讀寫的訪問帶寬。

高容錯性:上面簡單的介紹了一下高度容錯。系統故障是不可避免的,如何做到故障之後的數據恢復和容錯處理是至關重要的。HDFS通過多方面保證數據的可靠性,多分複製並且分佈到物理位置的不同服務器上,數據校驗功能、後臺的連續自檢數據一致性功能,都為高容錯提供了可能。

容量擴充:因為HDFS的block信息存放到namenode上,文件的block分佈到datanode上,當擴充的時候,僅僅添加datanode數量,系統可以在不停止服務的情況下做擴充,不需要人工干預。

2.2 MapReduce

從它名字上來看就大致可以看出個緣由,兩個動詞Map和Reduce。

Map(展開)就是將一個任務分解成為多個任務,Reduce就是將分解後多任務處理的結果彙總起來,得出最後的分析結果。

2.2.1 MapReduce原理

在Hadoop中,每個MapReduce任務都被初始化為一個Job,每個Job又可以分為兩種階段:map階段和reduce階段。這兩個階段分別用兩個函數表示,即map函數和reduce函數。map函數接收一個形式的輸入,然後同樣產生一個形式的中間輸出,Hadoop函數接收一個如形式的輸入,然後對這個value集合進行處理,每個reduce產生0或1個輸出,reduce的輸出也是形式的。

2.2.2 Map的過程

MapRunnable從input split中讀取一個個的record,然後依次調用Mapper的map函數,將結果輸出。map的輸出並不是直接寫入硬盤,而是將其寫入緩存memory buffer。當buffer中數據的到達一定的大小,一個背景線程將數據開始寫入硬盤。在寫入硬盤之前,內存中的數據通過partitioner分成多個partition。在同一個partition中,背景線程會將數據按照key在內存中排序。每次從內存向硬盤flush數據,都生成一個新的spill文件。

當此task結束之前,所有的spill文件被合併為一個整的被partition的而且排好序的文件。reducer可以通過http協議請求map的輸出文件,tracker.http.threads可以設置http服務線程數。

2.2.3 Reduce的過程

當map task結束後,其通知TaskTracker,TaskTracker通知JobTracker。對於一個job,JobTracker知道TaskTracer和map輸出的對應關係。reducer中一個線程週期性的向JobTracker請求map輸出的位置,直到其取得了所有的map輸出。reduce task需要其對應的partition的所有的map輸出。reduce task中的copy過程即當每個map task結束的時候就開始拷貝輸出,因為不同的map task完成時間不同。reduce task中有多個copy線程,可以並行拷貝map輸出。當很多map輸出拷貝到reduce task後,一個背景線程將其合併為一個大的排好序的文件。當所有的map輸出都拷貝到reduce task後,進入sort過程,將所有的map輸出合併為大的排好序的文件。最後進入reduce過程,調用reducer的reduce函數,處理排好序的輸出的每個key,最後的結果寫入HDFS。


分享到:


相關文章: