Hadoop分佈式文件系統(HDFS)設計用來可靠的存儲超大數據集,同時以高速帶寬將數據集傳輸給用戶應用。html
在一個超大集羣中,數以千計的服務器直接接觸存儲器和執行用戶應用任務。經過許多服務器的分佈式存儲和計算,資源隨需求增加的時候仍然能夠保持經濟性。node
咱們解釋了HDFS架構,同時介紹了咱們在雅虎使用HDFS去管理25PB企業數據的經驗。web
Hadoop的一個重要特色是將數據和計算能力劃分爲小部分,經過許多(數千)主機運行,這些主機並行計算獲得他們的結果。一個Hadoop集羣經過簡單增長商用服務器的數量來擴展其計算能力,存儲能力和IO帶寬。apache
相同點編程
HDFS分別存儲文件系統元數據和應用程序數據。與在其餘分佈式文件系統中相同,好比PVFS【2】【14】,Lustre【7】和GFS【5】【8】,緩存
HDFS在一個專門的服務器存儲元數據,這個服務器被稱爲名稱節點。應用程序數據存儲在其餘被稱爲數據結點的服務器上。服務器
不一樣點網絡
HDFS中的數據節點並不使用數據保護機制好比RAID(獨立磁盤冗餘陣列),以確保數據持久性。多線程
相反。好比GFS,其文件內容在多個數據節點是重複的以確保可靠性。架構
這個策略不只僅能夠確保數據持久性,還有額外的優勢:數據變形帶寬加倍,並且本地計算的時候服務器有更多機會靠近所須要的數據。
資料
【1】Hadoop快速入門(http://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html)
【2】Hadoop分佈式文件系統:架構和設計(http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html)
【3】從Hadoop框架與MapReduce模式中談海量數據處理(含淘寶技術架構)
備註
一、這篇文檔目的是幫助你快速完成單機上的Hadoop安裝與使用以便你對
Hadoop分佈式文件系統(HDFS)和Map-Reduce框架有所體會,好比在HDFS
上運行示例程序或簡單做業等。
二、【此文與本文徹底契合】
Hadoop分佈式文件系統(HDFS)被設計成適合運行在通用硬件(commodity
hardware)上的分佈式文件系統。
它和現有的分佈式文件系統有不少共同點。但同時,它和其餘的分佈式文件系
統的區別也是很明顯的。
HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞
吐量的數據訪問,很是適合大規模數據集上的應用。【與本文相互印證】
三、想讀懂此文,讀者必須先要明確如下幾點,以做爲閱讀後續內容的基礎知識儲備:
3.1 MapReduce是一種模式。
3.2 Hadoop是一種框架。
3.3 Hadoop是一個實現了mapreduce模式的開源的分佈式並行編程框架。
因此,你如今,知道了什麼是mapreduce,什麼是hadoop,以及這二者之間最簡單的聯繫,而本文的主旨便是,一句話歸納:在hadoop的框架上採起mapreduce的模式處理海量數據。下面,我們能夠依次深刻學習和了解mapreduce和hadoop這兩個東西了。【回顧基礎】
Mapreduce模式
mapreduce是一種雲計算的核心計算模式,一種分佈式運算技術,也是簡化的分佈式編程模式,它主要用於解決問題的程序開發模型,也是開發人員拆解問題的方法。
以下圖所示,mapreduce模式的主要思想是將自動分割要執行的問題(例如程序)拆解成map(映射)和reduce(化簡)的方式,流程圖以下圖1所示:
在數據被分割後經過Map 函數的程序將數據映射成不一樣的區塊,分配給計算機機羣處理達到分佈式運算的效果,在經過Reduce 函數的程序將結果彙整,從而輸出開發者須要的結果。
MapReduce致力於解決大規模數據處理的問題,所以在設計之初就考慮了數據的局部性原理,利用局部性原理將整個問題分而治之。
MapReduce集羣由普通PC機構成,爲無共享式架構。在處理以前,將數據集分佈至各個節點。處理時,每一個節點就近讀取本地存儲的數據處理(map),將處理後的數據進行合併(combine)、排序(shuffle and sort)後再分發(至reduce節點),避免了大量數據的傳輸,提升了處理效率。【相互印證】
無共享式架構的另外一個好處是配合複製(replication)策略,集羣能夠具備良好的容錯性,一部分節點的down機對集羣的正常工做不會形成影響。【相互印證】
Namenode 和 Datanode
HDFS採用master/slave架構。一個HDFS集羣是由一個Namenode和必定數目的Datanodes組成。
Namenode是一箇中心服務器,負責管理文件系統的名字空間(namespace)以及客戶端對文件的訪問。
集羣中的Datanode通常是一個節點一個,負責管理它所在節點上的存儲。
HDFS暴露了文件系統的名字空間,用戶可以以文件的形式在上面存儲數據。從內部看,一個文件其實被分紅一個或多個數據塊,這些塊存儲在一組Datanode上。
Namenode執行文件系統的名字空間操做,好比打開、關閉、重命名文件或目錄。它也負責肯定數據塊到具體Datanode節點的映射。Datanode負責處理文件系統客戶端的讀寫請求。在Namenode的統一調度下進行數據塊的建立、刪除和複製。
文件系統的名字空間 (namespace)
HDFS支持傳統的層次型文件組織結構。用戶或者應用程序能夠建立目錄,而後將文件保存在這些目錄裏。文件系統名字空間的層次結構和大多數現有的文件系統相似:用戶能夠建立、刪除、移動或重命名文件。當前,HDFS不支持用戶磁盤配額和訪問權限控制,也不支持硬連接和軟連接。可是HDFS架構並不妨礙實現這些特性。
Namenode負責維護文件系統的名字空間,任何對文件系統名字空間或屬性的修改都將被Namenode記錄下來。應用程序能夠設置HDFS保存的文件的副本數目。文件副本的數目稱爲文件的副本系數,這個信息也是由Namenode保存的。
【中斷了幾天沒翻譯都忘啦,今日發現一個講的很好的網站(Hadoop學習筆記一 簡要介紹)】
文中對上面那張HDFS Architecture的解釋:
從上面的圖中能夠看出,Namenode,Datanode,Client之間的通訊都是創建在TCP/IP的基礎之上的。
當Client要執行一個寫入的操做的時候,命令不是立刻就發送到Namenode,Client首先在本機上臨時文件夾中緩存這些數據,當臨時文件夾中的數據塊達到了設定的Block的值(默認是64M)時,Client便會通知Namenode,Namenode便響應Client的RPC請求,將文件名插入文件系統層次中而且在Datanode中找到一塊存放該數據的block,同時將該Datanode及對應的數據塊信息告訴Client,Client便這些本地臨時文件夾中的數據塊寫入指定的數據節點。
HDFS採起了副本策略,其目的是爲了提升系統的可靠性,可用性。HDFS的副本放置策略是三個副本,一個放在本節點上,一個放在同一機架中的另外一個節點上,還有一個副本放在另外一個不一樣的機架中的一個節點上。當前版本的hadoop0.12.0中尚未實現,可是正在進行中,相信不久就能夠出來了。&關於MapReduce的內容,建議看看孟巖的這篇MapReduce:The Free Lunch Is Not Over!【又發現一個大牛博客,但不怎麼更新了】
分別介紹7個部分的詳情
NameNode、DataNode、HDFS Client、Image與Journal、CheckpointNode、BackupNode和升級文件系統快照zz
HDFS名字空間是一個由文件和目錄組成的層次性結構。
當HDFS Client想讀取文件時,必須與NameNode聯繫以獲取組成該文件的blocks的位置信息,而後選擇一個離它最近的DataNode去讀取block內容。在寫數據時,client向NameNode發送請求,讓它指定應該由哪三個DataNodes來保存該block的三個副本。以後客戶端就會以pipeline的模式將數據寫入到DataNodes。
每個集羣有一個獨立的NameNode。每一個集羣包含數千DataNode和數萬HDFS客戶端。同時每一個數據節點能夠多線程的執行多個應用任務。
HDFS會將整個名字空間保存在內存中。由inode數據及每一個文件包含的全部blocks列表組成的名字系統元數據叫作image。保存在本機本地文件系統中的該image的一個持久化記錄稱爲一個checkpoint。NameNode也會將稱爲journal的針對該image的修改日誌保存到本機本地文件系統中。爲了提升持久性,能夠在其餘服務器上保存checkpoint和journal的多個副本。
2.2.二、DataNode
DataNode中的每一個block副本由本機本地文件系統中的兩個文件組成。第一個文件包含數據自己,第二個文件是該block的元數據包括該block數據的校驗和及該block的世代戳(generation stamp)。
在每一個DataNode啓動時,它會鏈接到NameNode執行一個握手。握手的目的是爲了驗證名字空間ID及DataNode的軟件版本。若是其中只要有一個沒法與NameNode匹配,那麼DataNode會自動關閉。……名字空間ID是在文件系統建立時分配給它的實例編號。……容許一個新初始化的而且沒有任何名字空間ID的DataNode加入到集羣中,它會接受集羣的名字空間ID。……在正常狀況下,DataNode會向NameNode發送心跳信息以證明它本身正在運行以及它所持有的block副本是可用的。默認的心跳週期是3秒鐘。【很像計算機網絡中的內容】……NameNode每秒能夠處理數千個心跳請求而不會影響到其餘的NameNode操做。
2.2.三、HDFS Client
當一個應用程序讀取一個文件時,HDFS client首先向NameNode詢問持有組成該文件的blocks的DataNodes列表。而後直接聯繫某個DataNode請求對於它所須要的block的傳輸。當client進行寫的時候,它會首先讓NameNode選定持有該文件的第一個block的那些DataNodes。客戶端會把這些節點組織成一個pipeline,而後發送數據。當第一個block寫出後,客戶端會繼續請求選定持有下一個block的新的DataNodes。新的pipeline會被創建起來,客戶端開始發送該文件後面的那些數據。每次選定的DataNodes多是不一樣的。
一個HDFS客戶端經過向NameNode傳輸path建立一個新文件。對於該文件的每一個block,NameNode返回持有它的副本的那些DataNodes列表。客戶端而後將數據經過pipeline的形式傳送給選定的DataNodes,DataNodes最終會再聯繫NameNode對block各副本的建立狀況進行確認。
名字空間image是表明應用數據的目錄和文件組織方式的文件系統元數據。寫入到磁盤中的image的持久化記錄稱爲checkpoint{!image在內存中,checkpoint則是在磁盤中}。
HDFS中的NameNode,除了能夠擔任客戶端請求服務者這一首要角色外,還能夠擔任其餘的一些角色好比CheckpointNode或者是BackupNode。節點能夠在啓動時設置它的角色。
CheckpointNode會週期性地合併現有的checkpoint和journal,建立一個新的checkpoint和一個空的journal。CheckpointNode一般運行在與NameNode不一樣的一個節點上,由於它須要與NameNode等同的內存空間。它會從NameNode下載當前的checkpoint和journal文件,而後在本地對它們進行合併,而後將新的checkpoint返回給NameNode。
BackupNode是HDFS最近引入的一個feature。與CheckpointNode相似,BackupNode可以建立週期性的checkpoints,可是除此以外它還在內存中維護了一個文件系統名字空間的最新映像,該映像會一直與NameNode狀態保持同步。
在軟件升級期間,由軟件bug或者人爲失誤致使的系統崩潰機率會上升。在HDFS中建立快照的目的是爲了最小化系統升級期間對存儲的數據的潛在威脅。
若是沒有錯誤發生,塊的構建就會通過像圖2那樣的三個階段。圖2展現了一個具備三個DataNodes的流水線及5個pakctes的block。圖中,粗線表明了數據包,虛線表明了確認消息,細線表明了用於創建和關閉流水線的控制消息。豎線表明了客戶端及3個DataNodes的活動,時間流向是自上而下的。
從t0到t1是流水線創建階段,t1到t2是數據流階段,t1表明了第一個數據包被髮送的時間點,t2表明了針對最後一個數據包的確認信息的接收時間點。在這裏,在第二個包傳輸時有一個hflush操做。hflush操做標識是與數據打包在一塊的,而不是獨立的一個操做。最後,t2到t3是針對該block的pipeline關閉階段。
對於一個大規模集羣來講,將全部節點用一種扁平的拓撲結構鏈接起來或許是不實際的。更經常使用的作法是經過多用機櫃來佈置全部結點。機櫃內的全部節點共享一個交換機,機櫃之間的交換則是經過一個或者多個核心交換機。不一樣機櫃的兩個節點的通訊會通過多用交換機。大多數狀況下,同一個機櫃的節點之間網絡帶寬比不一樣機櫃的兩節點之間網絡帶寬要高。圖3解釋了一個有兩個機櫃的集羣,每一個機櫃包含三個結點。
3.三、副本管理
···
3.四、平衡者
3.五、block掃描
3.六、下線
3.七、跨集羣數據拷貝
四、在雅虎中的實踐
Yahoo!從2004年開始基於分佈式文件系統的MapReduce的相關研究。Apache Hadoop項目在2006年成立。在那年年末,Yahoo!已經將Hadoop投入到內部使用,同時有一個用於開發的300個節點的集羣。從那時起,HDFS已經成爲Yahoo!後臺架構的不可或缺的一部分。
五、展望
···
佔位