Hadoop 架構與原理


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.    fsimageedits

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大小的數據包


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM