1. 程式人生 > >分散式計算框架Hadoop原理及架構全解

分散式計算框架Hadoop原理及架構全解

           Hadoop是Apache軟體基金會所開發的平行計算框架與分散式檔案系統。最核心的模組包括Hadoop Common、HDFS與MapReduce。HDFSHDFS是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負責管理節點上它們擁有的儲存,它將儲存劃分為多個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上資料塊的安全性。MapReduceMapReduce 來源MapReduce是由Google在一篇論文中提出並廣為流傳的。它最早是Google提出的一個軟體架構,用於大規模資料叢集分散式運算。任務的分解(Map)與結果的彙總(Reduce)是其主要思想。Map就是將一個任務分解成多個任務,Reduce就是將分解後多工分別處理,並將結果彙總為最終結果。熟悉Function Language的人一定感覺很熟悉,不是什麼新的思想。MapReduce 處理流程




上圖就是MapReduce大致的處理流程。在Map之前,可能還有對輸入資料的Split過程以保證任務並行效率,在Map之後可能還有Shuffle過程來提高Reduce的效率以及減小資料傳輸的壓力。HadoopHadoop被定位為一個易於使用的平臺,以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處理流程: