1.1. Hadoop架構
Hadoop1.0版本兩個核心:HDFS+MapReduce
Hadoop2.0版本,引入了Yarn。核心:HDFS+Yarn+Mapreduce
Yarn是資源調度框架。能夠細粒度的管理和調度任務。此外,還能夠支持其他的計算框架,比如spark等。
1.2. HDFS設計
單台機器的硬件擴展
縱向擴展的問題,是有硬件瓶頸的,包括成本也會指數型增長。
1.3. namenode工作職責:
1.要知道管理有哪些機器節點,即有哪些datanode。比如ip信息等。
2.要管理文件信息,文件名、文件多大、文件被切成幾塊、以及每一塊的存貯位置信息(存在哪個datanode節點上了),即管理元數據信息。
3.要有一個機制要知道集群里datanode節點的狀態變化。可以rpc心跳機制來做到。
4.namenode存在單點故障問題,可以再引入一台管理者節點。
5.datanode掛掉后,可能數據就丟失,文件就不完整了,要有一個備份機制,一般來說,一個文件塊,有3個備份,本機一份,同一機架的其他datanode有一份,另外一機器的機器上有一份。
1.4. HDFS細節說明
1.4.1. Hadoop塊概念
Hadoop1.0是按64MB切,BlockSize=64MB
Hadoop2.0 BlockSize=128MB
1.4.2. namenode
管理元數據信息,文件名,文件大小,文件塊信息等。
namdenode把元數據信息存到內存里,為了快速查詢,此外為了應對服務宕機而引起的元數據丟失,也要持久化到本地文件里。
namdenode不存儲具體塊數據,只存儲元數據信息;datanode用於負責存儲塊數據。
1.4.3. fsimage、edits
fsimage 文件,記錄元數據信息的文件
edits文件,記錄元數據信息改動的文件。只要元數據發生變化,這個edits文件就會有對應記錄。
fsimage和edits文件會定期做合並,這個周期默認是3600s。fsimage根據edits里改動記錄進行元數據更新。
元數據信息如果丟失,HDFS就不能正常工作了。
hadoop namenode -format 這個指令實際的作用時,創建了初始的fsimage文件和edits文件。
1.4.4. Secondarynamenode
負責將fsimage文件定期和edits文件做合並,合並之后,將合並后的元數據文件fsimage傳給namenode。這個SN相當於namenode輔助節點。
Hadoop集群最開始啟動的時候,創建Fsimage和edits文件,這個namenode做的,此外,namenode會做一次文件合並工作,這么做的目的是確保元數據信息是最新的,以為上次停集群的時候,可能還沒來的及做合並。但以后的合並工作,就交給SN去做了。這種SN機制是Hadoop1.0的機制。
結論:Hadoop1.0的SN達不到熱備效果,達不到元數據的實時更新,也就意味着了當namenode掛了的時候,元數據信息可能還會丟失,所以,Hadoop1.0版本的namenode還是單點故障問題。
1.5. HDFS架構圖
1.5.1. namenode
名字節點。要管理元數據信息(Metadata),注意,只存儲元數據信息。
namenode對於元數據信息的管理,放在內存一份,供訪問查詢,也會通過fsimage和edits文件,將元數據信息持久化到磁盤上。Hadoop1.0版本利用了SecondaryNamenode做fsimage和edits文件的合並,但是這種機制達不到熱備的效果。Hadoop1.0的namenode存在單點故障問題。
1.5.2. datanode
數據節點。用於存儲文件塊。為了防止datanode掛掉造成的數據丟失,對於文件塊要有備份,一個文件塊有三個副本。
1.5.3. rack
機架
1.5.4. client
客戶端,凡是通過API或指令操作的一端都可以看做是客戶端
1.5.5. blockSize
數據塊。Hadoop1.0:64MB。Hadoop2.0 :128MB。
塊大小的問題。從大數據處理角度來看,塊越大越好。所以從技術的發展,以后的塊會越來越大,因為塊大,會減少磁盤尋址次數,從而減少尋址時間
1.6. HDFS讀流程圖
5.
1.客戶端發出讀數據請求,Open File指定讀取的文件路徑,去找namenode要元數據信息。
2.namenode將文件的元數據信息返回給客戶端。
3. 3客戶端根據返回的元數據信息,去對應的datanode去讀塊數據。
假如一個文件特別大,比如1TB,會分成好多塊,此時,namenode並是不一次性把所有的元數據信息返回給客戶端。
4. 4客戶端讀完此部分后,再去想namenode要下一部分的元數據信息,再接着讀。
5.讀完之后,通知namenode關閉流
1.7. HDFS寫流程
1.發起一個寫數據請求,並指定上傳文件的路徑,然后去找namenode。namenode首先會判斷路徑合法性,然后會判斷此客戶端是否有寫權限。然后都滿足,namenode會給客戶端返回一個輸出流。此外,namenode會為文件分配塊存儲信息。注意,namenode也是分配塊的存儲信息,但不做物理切塊工作。
2.客戶端拿到輸出流以及塊存儲信息之后,就開始向datanode寫數據。因為一個塊數據,有三個副本,所以圖里有三個datanode。packet初學時可以簡單理解為就是一塊數據。
pipeLine:[bl1,datanode01-datanode03-datanode-07]
3.數據塊的發送,先發給第一台datanode,然后再有第一台datanode發往第二台datanode,……。實際這里,用到了pipeLine 數據流管道的思想。
4.通過ack確認機制,向上游節點發送確認,這么做的目的是確保塊數據復制的完整性。
5.通過最上游節點,向客戶端發送ack,如果塊數據沒有發送完,就繼續發送下一塊。如果所有塊數據都已發完,就可以關流了。
6.所有塊數據都寫完后,關流。
擴展:
數據流管道的目的:
我們的目標
是充分利用每台機器的帶寬,避免網絡瓶頸和高延時的連接,最小化推送所有數據的延時。 此外,利用通信的通信雙工,能夠提高傳輸效率。
packet 是一個64kb大小的數據包