一、Hadoop簡介
Hadoop最早起源於Nutch。Nutch是一個開源的網絡搜索引擎,由Doug Cutting於2002年創建。Nutch的設計目標是構建一個大型的全網搜索引擎,包括網頁抓取、索引,查詢等功能,隨着網頁抓取數量的增加,遇到嚴重的可擴展問題,即不能解決數十億網頁的存儲和索引的問題,之后,Google發布的兩篇論文(The Google File System和MapReduce: Simplified Data Processing on Large Clusters)為該問題提供了可行的解決方案。
Hadoop是一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有着高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬件上。而且它提供高傳輸率(high throughput)來訪問應用程序的數據,適合那些有着超大數據集(large data set)的應用程序,以流的形式訪問(streaming access)文件系統中的數據。
二、Hadoop的優點
Hadoop是一個能夠對大量數據進行分布式處理的軟件框架。但是 Hadoop 是以一種可靠、高效、可伸縮的方式進行處理的。Hadoop 是可靠的,因為它假設計算元素和存儲會失敗,因此它維護多個工作數據副本,確保能夠針對失敗的節點重新分布處理。Hadoop 是高效的,因為它以並行的方式工作,通過並行處理加快處理速度。Hadoop 還是可伸縮的,能夠處理 PB 級數據。此外,Hadoop 依賴於社區服務器,因此它的成本比較低,任何人都可以使用。
Hadoop是一個能夠讓用戶輕松架構和使用的分布式計算平台。用戶可以輕松地在Hadoop上開發和運行處理海量數據的應用程序。它主要有以下幾個優點:
⒈高可靠性。Hadoop按位存儲和處理數據的能力值得人們信賴。
⒉高擴展性。Hadoop是在可用的計算機集簇間分配數據並完成計算任務的,這些集簇可以方便地擴展到數以千計的節點中。
⒊高效性。Hadoop能夠在節點之間動態地移動數據,並保證各個節點的動態平衡,因此處理速度非常快。
⒋高容錯性。Hadoop能夠自動保存數據的多個副本,並且能夠自動將失敗的任務重新分配。
Hadoop帶有用 Java 語言編寫的框架,因此運行在 Linux 生產平台上是非常理想的。Hadoop 上的應用程序也可以使用其他語言編寫,比如 C、C++。
三 Hadoop架構
Hadoop由兩部分組成,分別是分布式文件系統(HDFS)和分布式計算框架MapReduce。其中分布式文件系統(DFS)主要用於大規模數據的分布式存儲,而MapReduce則構建在分布式文件系統之上,對於存儲在分布式文件系統中的數據進行分布式計算。
在Hadoop中,MapReduce底層的分布式文件系統是獨立模塊,用戶可以按照約定的一套接口實現自己的分布式文件系統,存儲在該文件系統上的數據便可以被MapReduce處理。Hadoop默認使用的是分布式文件系統是(Hadoop Distributed File System,Hadoop分布式文件系統),它與MapReduce框架緊密結合。下面首先介紹HDFS,然后介紹MapReduce計算框架。
1、HDFS架構
HDFS是一個具有高度容錯性的分布式文件系統,適合部署在廉價的機器上,HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。架構圖 如下圖所示:
Hadoop部署架構圖
HDFS的架構總體上采用了m/S(master/slave)架構,主要有以下幾個組件組成:Client、NameNode、Secondary NodeNode和DataNode。
(1)Client
Client(用戶)通過NameNode和DataNode交互訪問HDFS中的文件。Client提供一個類似POSIX的文件系統接口工用戶調用。
(2)NameNode
整個Hadoop集群中只有一個NameNode.它是整個系統的中樞,它負責管理HDFS的目錄樹和相關文件 元數據信息。這些信息是以“fsimage(HDFS元數據鏡像文件)和Editlog(HDFS文件改動日志)兩個文件形式存放在本地磁盤,當HDFS重啟時沖洗構造出來的。NameNode還負責監控各個DataNode的健康狀態,一旦發現某個DataNode損壞,則將DataNode移出HDFS並重新備份其上面的數據。
(3)Secondary NameNode
Secondary Namenode 最重要的任務並不是為NameNode元數據進行熱備份,而是定期合並fsimage和edits日志,並傳輸給NameNode,為了減輕NameNode壓力,NameNode自己並不會合並fsimage和edits,並將文件存儲到磁盤上,而是交由Secondary NameNode完成。
(4)DataNode
每個Slave節點上安裝一個DataNode,它負責實際的數據存儲,並將數據信息定期匯報給NameNode。DataNode以固定大小的block為基本單位組織文件內容,block默認大小為64MB(GFS也是64MB)。當用戶上傳一個大於64MB的文件時,該文件會被切成若干個block,分別存儲到不同的DataNode(更容易分布式處理);同時為了數據可靠,會將同一個block以流水線的方式寫到若干個(配置中默認為3)不同的DataNode上。
2、Hadoop MapReduce架構
Hadoop MapReduce也采用Master/Slave(M/S)架構。它主要有以下幾個組件組成:Client、ClientTracker、TaskTracker和Task。
(1)Client
用戶編寫的MapReduce 程序通過Client 提交到JobTracker 端;同時,用戶可通過Client 提供的一些接口查看作業運行狀態。在Hadoop 內部用“作業”(Job)表示MapReduce 程序。一個MapReduce 程序可對應若干個作業,而每個作業會被分解成若干個Map/Reduce 任務(Task)。
(2)JobTracker
JobTracker 主要負責資源監控和作業調度。JobTracker 監控所有TaskTracker 與作業的健康狀況,一旦發現失敗情況后,其會將相應的任務轉移到其他節點;同時,JobTracker 會跟蹤任務的執行進度、資源使用量等信息,並將這些信息告訴任務調度器,而調度器會在資源出現空閑時,選擇合適的任務使用這些資源。在Hadoop 中,任務調度器是一個可插拔的模塊,用戶可以根據自己的需要設計相應的調度器。
(3)TaskTracker
TaskTracker 會周期性地通過Heartbeat 將本節點上資源的使用情況和任務的運行進度匯報給JobTracker,同時接收JobTracker 發送過來的命令並執行相應的操作(如啟動新任務、殺死任務等)。TaskTracker 使用“slot”等量划分本節點上的資源量。“slot”代表計算資源(CPU、內存等)。一個Task 獲取到一個slot 后才有機會運行,而Hadoop 調度器的作用就是將各個TaskTracker 上的空閑slot 分配給Task 使用。slot 分為Map slot 和Reduce slot 兩種,分別供MapTask 和Reduce Task 使用。TaskTracker 通過slot 數目(可配置參數)限定Task 的並發度。
(4)Task
Task 分為Map Task 和Reduce Task 兩種,均由TaskTracker 啟動。我們知道,HDFS 以固定大小的block 為基本單位存儲數據,而對於MapReduce 而言,其處理單位是split。split 是一個邏輯概念,它只包含一些元數據信息,比如數據起始位置、數據長度、數據所在節點等。它的划分方法完全由用戶自己決定。但需要注意的是,split 的多少決定了Map Task 的數目,因為每個split 會交由一個Map Task 處理。
下一節將介紹Hadoop配置文件,然后逐步深入Hadoop內核源碼的分析研究。