hadoop(HDFS的數據流)

HDFS寫數據流程

在這裏插入圖片描述


  1. 開始上傳文件時,客戶端通過Distributed FileSystem這個抽象的HDFS對象向NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。
  2. NameNode返回是否可以上傳。
  3. 客戶端將文件邏輯的根據塊大小進行劃分,然後請求NameNode第一個Block上傳到哪幾個DataNode服務器上。
  4. NameNode返回一個清單,清單上面是3個DataNode節點,分別爲Dn1,Dn2,Dn3;返回的節點數量取決於HDFS設置的副本數量
  5. 客戶端創建本地流:FSDataOutputStream;通過本地出向信息流請求建立第一個Block的傳輸通道;Dn1收到請求會繼續請求調用Dn2,然後Dn2收到請求會繼續請求調用Dn3,然後第一個Block的通道建立成功
  6. Dn3,Dn2,Dn1逐級應答客戶端:末端的Dn3向客戶端返回應答,Dn2收到Dn3的應答後纔會向Dn1方向發送應答
  7. 客戶端收到應答後,開始往Dn1上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet爲單位,Dn1收到一個Packet就會傳給Dn2,Dn2收到傳給Dn3;Dn1每傳一個Packet就會將其放入一個應答隊列等待應答
  8. 當第一個Block傳輸完成之後,客戶端再次請求NameNode上傳第二個Block給DataNode服務器(重複執行3-7步)

注:

  1. Block的傳送並不是一塊傳送完畢再傳送第二塊,其實是併發執行的,當自己的隊列中的塊都落戶完了,該隊列就清空了,就可以放下一塊了。
  2. 每次塊請求NameNode返回的DataNode清單中的節點不一定相同;NameNode返回的三個節點,第一個是離塊最近的DataNode,第二個和第三個都是由第一個DataNode隨機選出來的。

網絡拓撲----節點計算

在HDFS寫數據的過程中,NameNode會選擇距離待上傳數據最近距離的DataNode接收數據。那麼這個最近距離怎麼計算呢?
節點距離:兩個節點到達最近的共同祖先的距離總和


假如:假設有數據中心d1機架r1中的節點n1。該節點可以表示爲/d1/r1/n1。利用這種標記,這裏給出四種距離描述
在這裏插入圖片描述
所以如果要是DataNode1作爲客戶端上傳文件,那麼NameNode返回的清單中,第一個DataNode節點肯定是Datanode1自己本身;因爲自己是離自己最近的

機架感知(副本存儲節點選擇)

  1. 官方機架感知說明

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
在這裏插入圖片描述

  1. Hadoop副本節點選擇
  1. 第一個副本在Client所處的節點上。如果客戶端在集羣外,隨機選一個。
  2. 第二個副本和第一個副本位於相同機架,隨機節點。
  3. 第三個副本位於不同機架,隨機節點。

這樣做使得冗餘性和讀取的速度處於一個較好的平衡


HDFS讀數據流程

在這裏插入圖片描述


  1. 開始讀取文件時,客戶端通過Distributed FileSystem這個抽象的HDFS對象向NameNode請求下載文件,NameNode通過查詢元文件,找到文件所在的DataNode地址。
  2. 挑選一臺DataNode(就近原則,然後隨機)服務器,請求讀取數據。
  3. DataNode開始傳輸數據給客戶端(從磁盤裏面讀取數據輸入流,以Packet爲單位來做校驗)。
  4. 客戶端以Packet爲單位接收,先在本地緩存,然後寫入目標文件。
  5. 然後重複3-4步
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章