Hadoop之HDFS(二)


  上篇主要介紹了HDFS的一些基本知識,這篇主要講解HDFS的讀寫流程以及一些其他的知識點。

1、HDFS讀流程

 ; HDFS的讀流程比較簡單,主要如下圖所示。
在這裏插入圖片描述
  1、首先客戶端Client會創建FileSystem對象,而其具體的實現則是DistributedFileSystem,調用該對象的open方法,並通過RPC與NameNode進行通信;
  2、NameNode會給客戶端返回一些block的信息,比如block塊位置信息,該信息是被封裝在了一個FSDataInputStream的輸入流中;
  3、客戶端通過FSDataInputStream流讀取離客戶端最近的datanode上的block;
  4、讀取完當前的block的數據之後,關閉當前與datanode的連接,並尋找下一個block的datanode節點;
  5、讀取完一個block,都會進行checksum計算,若讀取datanode出現錯誤時,客戶端會通知namenode,然後從該數據的另一個block繼續讀取。

2、HDFS寫流程

  HDFS的寫流程相對於讀流程來說是比較複雜的,在介紹寫流程之前,相對其中的一些概念進以說明。

  • chunk:chunk是進行寫入的時候進行校驗的最小單位,一個chunk是512Byte(數據)+4Byte(校驗和checksum),當數據進行寫入的時候,首先會被分成一個個512Byte大小的字節,並對這些字節做checksum(算法是CRC32)
  • packet:packet是數據進行寫入的最小單位,HDFS進行寫入的時候不是數據內容一次性的全部寫入,而是以一個packet爲基本單位,進行寫入。packet的大小爲64KB。

  下圖所示即爲HDFS的寫流程示意圖
在這裏插入圖片描述
  下面對HDFS的寫入流程進行深入分析
  1、首先客戶端Client會創建FileSystem對象,而其具體的實現則是DistributedFileSystem,調用該對象的create方法,客戶端通過RPC與NameNode進行通信;
  2、NameNode會檢查文件是否存在,檢查權限等,若通過檢查,則會返回FSDataOutputStream輸出流對象;
  3、輸出流對象建立好後,則調用write方法進行數據的寫入。首先會將數據寫入到chunk中,當chunk爲512Byte時,對chunk進行checksum,並將整體放入到packet中,當packet達到64KB後,將packet放入到data queue中,而此時datanode則從packet中拿取數據進行寫入
  4、寫入的過程是將packet先寫入到datanode1,再由datanode1寫入到datanode2,在由datanode2寫入到datanode3。
  5、之後進行ack的返回,返回的順序與寫入的順序剛好相反,由datanode3到datanode2,再到datanode1。
  6、若ack queue收到確認寫入的消息後,則將ack queue中的packet移除,若沒有,則將ack queue中的packet重新放回到data queue中。

3、HDFS聯邦

  NameNode存儲的是datanode的元數據信息,而這些元數據信息是保存在NameNode節點的內存之中的,這就導致對一個超大集羣來說,內存會成爲限制系統橫向擴展的瓶頸。在系統的整體性能方面,其吞吐量會受到單個NameNode的影響。所以,在2.X之後引入聯邦機制來解決上述問題。
  在聯邦的情況下,每個NameNode維護一個命名空間卷,由命名空間的元數據和一個數據塊池組成,數據塊池包含該命名空間下文件的所有數據塊。命名空間卷之間是相互獨立的,兩兩之間也不通信,NameNode之間也互不影響。因此,集羣中的DataNode需要到每個NameNode中進行註冊,並且存儲着來自多個塊池的數據塊。
  聯邦的出現主要解決了以下問題
  1、系統的擴展性可以進行橫向提升
  2、系統的性能隨着聯邦的出現,吞吐量不在受限於單個NameNode節點
  3、隔離性,一個程序的運行不會由於資源消耗過多的問題影響另一個程序的運行

4、HDFS的高可用

  對於HDFS來說,NameNode中保存的是元數據信息,並管理文件系統的命名空間和處理客戶端的讀寫請求。在一個集羣中,如果只存在一個NameNode,一旦發生故障,則會使整個系統失效。
  我們知道,在HDFS的架構中,有個SecondaryNameNode,但這個不是NameNode的熱備份,在NameNode發生故障時,NameNode無法立即切換到SecondaryNameNode並對外提供服務。所以,針對這種情況,HDFS2.X增加了對HDFS高可用(HA)的支持,配置了一對(active-standby)NameNode。
  當active NameNode失效後,standby NameNode會接管任務並服務於來自客戶端的請求,不會有任何明顯的中斷。由於standby NameNode是active NameNode的熱備份,所以active NameNode的信息必須實時的同步到standby NameNode上,該同步的實現方式是通過共享存儲系統來實現狀態同步的,共享存儲系統可以使用NFS過濾器或羣體日誌管理器QJM來實現。
  QJM是專用的HDFS實現,其是以一組日誌節點的形式運行,每一次編輯必須寫入到多數的日誌節點,被推薦用於大多數的HDFS部署中。QJM的實現並沒有使用到Zookeeper技術,但NameNode的選舉使用到了Zookeeper技術。active NameNode將更新的數據寫入到共享存儲 系統,standby NameNode一直監聽該系統,一旦發現有新的數據寫入,立即將這些新的數據讀取並加載到自己的內存中,從而保證與active NameNode的狀態一致。由於這種設計,則需要DataNode將心跳信息和塊報告信息同時發送到這兩個NameNode上。

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