Hadoop原理及架構
HDFS
HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。采用Java語言開發,可以部署在多種普通的廉價機器上,以集群處理數量積達到大型主機處理性能。
HDFS 架構原理
HDFS采用master/slave架構。一個HDFS集群包含一個單獨的NameNode和多個DataNode。NameNode作為master服務,它負責管理文件系統的命名空間和客戶端對文件的訪問。NameNode會保存文件系統的具體信息,包括文件信息、文件被分割成具體block塊的信息、以及每一個block塊歸屬的DataNode的信息。對於整個集群來說,HDFS通過NameNode對用戶提供了一個單一的命名空間。 DataNode作為slave服務,在集群中可以存在多個。通常每一個DataNode都對應於一個物理節點(當然也不排除每個物理節點可以有多個DataNode,不過生產環境裏不建議這麽做)。DataNode負責管理節點上它們擁有的存儲,它將存儲劃分為多個block塊,管理block塊信息,同時周期性的將其所有的block塊信息發送給NameNode。
下圖為HDFS系統架構圖,主要有三個角色,Client、NameNode、DataNode。
文件寫入時
Client向NameNode發起文件寫入的請求。
NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
Client將文件劃分為多個block塊,並根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。
當文件讀取
Client向NameNode發起文件讀取的請求。
NameNode返回文件存儲的block塊信息、及其block塊所在DataNode的信息。
Client讀取文件信息。
HDFS 數據備份
HDFS被設計成一個可以在大集群中、跨機器、可靠的存儲海量數據的框架。它將所有文件存儲成block塊組成的序列,除了最後一個block塊,所有的block塊大小都是一樣的。文件的所有block塊都會因為容錯而被復制。每個文件的block塊大小和容錯復制份數都是可配置的。容錯復制份數可以在文件創建時配置,後期也可以修改。HDFS中的文件默認規則是write one(一次寫、多次讀)的,並且嚴格要求在任何時候只有一個writer。NameNode負責管理block塊的復制,它周期性地接收集群中所有DataNode的心跳數據包和Blockreport。心跳包表示DataNode正常工作,Blockreport描述了該DataNode上所有的block組成的列表。
備份數據的存放
備份數據的存放是HDFS可靠性和性能的關鍵。HDFS采用一種稱為rack-aware的策略來決定備份數據的存放。通過一個稱為Rack Awareness的過程,NameNode決定每個DataNode所屬rack id。缺省情況下,一個block塊會有三個備份,一個在NameNode指定的DataNode上,一個在指定DataNode非同一rack的DataNode上,一個在指定DataNode同一rack的DataNode上。這種策略綜合考慮了同一rack失效、以及不同rack之間數據復制性能問題。
副本的選擇
為了降低整體的帶寬消耗和讀取延時,HDFS會盡量讀取最近的副本。如果在同一個rack上有一個副本,那麽就讀該副本。如果一個HDFS集群跨越多個數據中心,那麽將首先嘗試讀本地數據中心的副本。
安全模式
系統啟動後先進入安全模式,此時系統中的內容不允許修改和刪除,直到安全模式結束。安全模式主要是為了啟動檢查各個DataNode上數據塊的安全性。
MapReduce
來源
MapReduce是由Google在一篇論文中提出並廣為流傳的。它最早是Google提出的一個軟件架構,用於大規模數據集群分布式運算。任務的分解(Map)與結果的匯總(Reduce)是其主要思想。Map就是將一個任務分解成多個任務,Reduce就是將分解後多任務分別處理,並將結果匯總為最終結果。熟悉Function Language的人一定感覺很熟悉,不是什麽新的思想。
MapReduce 處理流程
上圖就是MapReduce大致的處理流程。在Map之前,可能還有對輸入數據的Split過程以保證任務並行效率,在Map之後可能還有Shuffle過程來提高Reduce的效率以及減小數據傳輸的壓力。
Hadoop
Hadoop被定位為一個易於使用的平臺,以HDFS、MapReduce為基礎,能夠運行上千臺PCServer組成的系統集群,並以一種可靠、容錯的方式分布式處理請求。
Hadoop 部署
下圖顯示Hadoop部署結構示意圖
在Hadoop的系統中,會有一臺master,主要負責NameNode的工作以及JobTracker的工作。JobTracker的主要職責就是啟動、跟蹤和調度各個Slave的任務執行。還會有多臺slave,每一臺slave通常具有DataNode的功能並負責TaskTracker的工作。TaskTracker根據應用要求來結合本地數據執行Map任務以及Reduce任務。
Hadoop 處理流程
在描述Hadoop處理流程之前,先提一個分布式計算最為重要的設計原則:Moving Computation is Cheaper than Moving Data。意思是指在分布式計算中,移動計算的代價總是低於移動數據的代價。本地計算使用本地數據,然後匯總才能保證分布式計算的高效性。下圖所示Hadoop處理流程:
Hadoop原理及架構