HDFS讀書筆記-總體介紹(一)

朋友寫的【HDFS系列】,覺得挺好。原文地址,點我

一直以來對hadoop相關係列的學習都是較爲零散的,不成體系。沒有經過自己總結和沉澱的資料也很難長久的消化和在工作中實際運用。故而也希望通過這樣系列的方式對所學習,所瞭解的資料進行總結。

HDFS(Hadoop Distributed File System)

顧名思義,是hadoop的分佈式文件系統。HDFS是hadoop的一個子項目。Hadoop的名字在這裏也提一下,是作者小孩很喜歡的一隻小象玩具的名字。

HDFS的目標:

1、部署在廉價的PC服務器上。

2、用數據冗餘的方式提供高容錯性,認爲硬件故障是常態。

3、一次寫入,多次讀取。(簡單的數據一致性,所以場景有限)

4、提供高吞吐量,非低延遲。(一般用於離線計算存儲)

5、海量數據,超大集羣。


架構圖

HDFS讀書筆記-總體介紹(一)

    HDFS使用經典的主從結構,由一個NameNode和N個DataNode組成。簡單來說,NameNode就是一個維護了什麼文件在哪臺機器上的元數據集合。而DataNode就是存儲實際文件的機器。

   從圖上可以看出,client要訪問文件,會先從NameNode獲取到元數據,再訪問實際的機器。

   而一個NameNode會存在兩個問題:

1、爲了降低獲取元數據的延遲,所有的元數據都常駐內存中,故而有內存限制。

2、單點問題,一旦NameNode掛掉,HDFS就只能人工干預並進行恢復。

   這兩個問題都可以單獨以一個篇幅來講述,所以在這裏僅點到爲止。後續的系列中我會單獨敘述。

   HDFS一般針對大文件,主要由於文件數目越多,NameNode內存越大。這樣會大大降低NameNode的工作能力。(針對小文件的優化,在系列中我們會講到)

   DataNode中文件是以block的方式存放的,一個文件可能會被切分成多個block,簡單來說一個文件如果是100M,會被切割成一個64M,一個36M的Blocks存儲在DataNode中。(每個block默認64M,可配置),一個block中只會有一個文件的內容,當一個文件小於64M的時候,依然獨佔此block,但是不真正佔用磁盤64M。以Block爲單位來存放數據的好處是可增加文件讀取和寫入的並行能力,極大的提高DataNode的磁盤效率,並且對於文件的定位有更好的幫助。

   多個block會分佈在不同的機器上,並且每個block會有相對應的備份。(默認數目爲3)

   NameNode得知整體dataNode中的存儲情況是通過DataNode定時向NameNode心跳並彙報當前block情況。如果一定的時間內DataNode中沒有心跳彙報,NameNode則會認爲該DataNode掛掉,進而會進行以下的處理。

     1、返回給客戶端的機器列表中不再有掛掉的機器。(返回給客戶端的機器列表不是namenode主動推送的。是客戶端定時從namenode同步一次的。 不過有些版本的hdfs會把這部分信息存儲在zookeeper中通知過去。 不過這個成本是有點高的)

     2、根據當前集羣的情況,將掛掉的機器上的block進行冗餘備份,以達到用戶配置的冗餘數目。(我們說過一份block會有3個備份。 一臺機器掛掉了,還有另外兩個備份在其他兩個機器上。 namenode會判斷哪個機器比較合適再放一個備份。 然後把block複製一份過去。 讓總體的備份數目達到3)

   在這裏,筆者也要提出:常見的分佈式存儲系統,對於性能和容錯等問題的優化方式一般是主要有兩方面:

     1、使用內存(本地內存、分佈式內存)。

     2、使用數據冗餘。

   瞭解整個結構如何協作的最好的方法就是來看如何讀、寫一個文件,從而能瞭解到整個流程:

文件寫入

流程圖:

HDFS讀書筆記-總體介紹(一)

     1、客戶端向遠程的Namenode發起創建文件請求; 

     2、Namenode會檢查要創建的文件是否已經存在,創建者是否有權限進行操作,成功則會爲文件創建一個記錄,否則會讓客戶端拋出異常; 
     3、當客戶端開始寫入文件的時候,開發庫會將文件切分成多個packets,並在內部以"data queue"的形式管理這些packets,並向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表,列表的大小根據在Namenode中對replication的設置而定。 
     4、開始以pipeline(管道)的形式將packet寫入所有的replicas中。開發庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲之後,再將其傳遞給在此pipeline中的下一個datanode,直到最後一個datanode,這種寫數據的方式呈流水線的形式。
     5、最後一個datanode成功存儲之後會返回一個ack packet,在pipeline裏傳遞至客戶端,在客戶端的開發庫內部維護着"ack queue",成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet。 
     6、如果傳輸過程中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除,剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設定的數量。
     7、通知NameNode寫入成功。NameNode對外提供此文件的訪問目錄。
 

文件讀取

HDFS讀書筆記-總體介紹(一)

     1、使用HDFS提供的客戶端開發庫,向遠程的Namenode發起RPC請求; 

     2、Namenode會視情況返回文件的部分或者全部block列表,對於每個block,Namenode都會返回有該block拷貝的datanode地址; 

     3、客戶端開發庫會選取離客戶端最接近的datanode來讀取block; 

     4、讀取完當前block的數據後,關閉與當前的datanode連接,併爲讀取下一個block尋找最佳的datanode; 

     5、當讀完列表的block後,且文件讀取還沒有結束,客戶端開發庫會繼續向Namenode獲取下一批的block列表。 

     6、讀取完一個block都會進行checksum驗證,如果讀取datanode時出現錯誤,客戶端會通知Namenode,然後再從下一個擁有該block拷貝的datanode繼續讀。

   本篇文章,我們簡單的介紹了HDFS的架構和讀寫流程,下篇文章,我們會來分析:

HDFS讀書筆記-瞭解NameNode(二)

   最後,筆者要說明的是,很多分佈式系統的架構、原理、優化方式都是類似的,思考每一個方法的合理性以及適用場景能夠幫助我們迅速的瞭解到其他的分佈式系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章