其餘更多java基礎文章:
java基礎學習(目錄)html
學習資料
深刻理解HDFS:Hadoop分佈式文件系統java
HDFS是Hadoop Distribute File System 的簡稱,也就是Hadoop的一個分佈式文件系統。
分佈式文件系統(DistributedFileSystem) 是指文件系統管理的物理存儲資源不必定直接鏈接在本地節點上,而是經過計算機網絡與節點相連。分佈式文件系統的設計基於客戶機/服務器模式。一個典型的網絡可能包括多個供多用戶訪問的服務器。node
在HDFS系統中,爲了便於文件的管理和備份,引入分塊概念(block)。這裏的塊是HDFS存儲系統當中的最小單位,HDFS默認定義一個塊的大小在Hadoop1.0中爲64MB,Hadoop2.0中爲128MB。當有文件上傳到HDFS上時,若文件大小大於設置的塊大小,則該文件會被切分存儲爲多個塊,多個塊能夠存放在不一樣的DataNode上。但值得注意的是若是某文件大小沒有到達64/128MB,該文件並不會佔據整個塊空間 。(例如當一個1MB的文件存儲在128MB的塊中,文件只使用1MB的硬盤空間,而不是128MB)。默認副本數爲3。服務器
namenode是管理文件系統的命名空間。它維護者文件系統樹及整顆樹內全部的文件和目錄。這些信息以兩個文件形式永久保存在本地磁盤上:fsimage命名空間鏡像文件和edits編輯日誌文件。namenode也記錄着每一個文件中各個塊所在的數據節點信息,但它並不永久保存塊的位置信息,由於這些信息會在系統啓動時根據數據節點信息重建。網絡
datanode是文件系統的工做節點。它們根據須要存儲並檢索數據塊,並按期向namenode發送它們所存儲的塊的列表。架構
secondnamenode又稱爲輔助namenode。secondnamenode不能被用做namenode,它的重要做用是按期合併namenode編輯日誌與命名空間鏡像,以防編輯日誌過大。可是,secondnamenode保存的狀態老是滯後於主節點namenode。分佈式
客戶端,系統使用者,調用HDFS API操做文件;與NN交互獲取文件元數據;與DN交互進行數據讀寫。oop
hadoop的默認佈局策略是在運行客戶端的節點上放第1個複本(若是客戶端運行在集羣以外,就隨機的選擇一個節點,可是系統會避免挑選那些存儲太滿或太忙的節點)。第2個複本放在與第1個不一樣且是隨機選擇的另外的機架中的節點上。第3個複本與第2個複本放在同一個機架上面,且是隨機選擇的一個節點,其餘的複本放在集羣中隨機選擇的節點上面,可是系統會盡可能避免在相同的機架上面放太多的複本。 佈局
在學習過程當中,發現這篇文章寫得很全面,這個部分很是重要,但願你們好好閱讀這篇文章。
對於分佈式文件系統HDFS ,NN是系統的核心節點,存儲了各種元數據信息,並負責管理文件系統的命名空間和客戶端對文件的訪問。可是,在HDFS1.0中,只存在一個NN,一旦發生「單點故障」,就會致使整個系統失效。
HDFS2.0採用了HA(High Availability)架構。在HA集羣中,通常設置兩個NN,其中一個處於「活躍(Active)」狀態,另外一個處於「待命(Standby)」狀態。處於Active狀態的NN負責對外處理全部客戶端的請求,處於Standby狀態的NN做爲熱備份節點,保存了足夠多的元數據,在Active節點發生故障時,當即切換到活躍狀態對外提供服務。
因爲Standby NN是Active NN的「熱備份」,所以Active NN的狀態信息必須實時同步到StandbyNN。針對狀態同步,能夠藉助一個共享存儲系統來實現,如NFS(NetworkFile System)、QJM(Quorum Journal Manager)或者Zookeeper。Active NN將更新數據寫入到共享存儲系統,Standby NN會一直監聽該系統,一旦發現有新的寫入,就當即從公共存儲系統中讀取這些數據並加載到本身內存中,從而保證與Active NN狀態一致。
此外,NN保存了數據塊到實際存儲位置的映射信息,即每一個數據塊是由哪一個DN存儲的。當一個DN加入到集羣中時,它會把本身所包含的數據塊列表給NN,按期經過心跳方式,以確保NN中的塊映射是最新的。所以,爲了實現故障時的快速切換,必須保證StandbyNN中也包含最新的塊映射信息,爲此須要給DN配置Active和Standby兩個NN的地址,把塊的位置和心跳信息同時發送到兩個NN上。爲了防止出現「兩個管家」現象,還要保證在任什麼時候刻都只有一個NN處於Active狀態,須要Zookeeper實現。
雖然HDFS HA解決了「單點故障」問題,可是在系統擴展性、總體性能和隔離性方面仍然存在問題。
HDFS聯邦能夠解決以上三個方面問題。