HDFS 讀寫流程(詳解)

概述

HDFS(Hadoop Distributed File System)是GFS的開源實現。

HDFS的優缺點

1、優點

因為有多個副本,可以保證數據可靠,容錯性高

計算向數據移動,適用於批處理

適合大數據處理,GB、TB、PB級數據,百萬以上的文件,十萬以上的節點

可以構建在廉價機器上,通過多副本提高可靠性

2、缺點

不支持低延遲的數據訪問,無法再毫秒之內返回結果

小文件對於HDFS是致命的,會佔用大量的NameNode的存儲空間

併發寫入和文件隨機修改困難,因為它一個文件在同一時刻只能有一個寫入者,而且只支持append

HDFS的寫流程


HDFS 讀寫流程(詳解)


寫流程如下:

  1、客戶端訪問NameNode,NameNode檢查路徑和權限,如果路徑中有與要上傳的文件重名的文件就不能上傳了,不能覆蓋,如果沒有才創建,創建名為file.copying的臨時文件;

  2、NameNode觸發副本放置策略,如果客戶端在集群內的某一臺機器,那麼副本第一塊放置在該服務器上,然後再另外挑兩臺服務器;如果在集群外,namenode會根據策略先找一個機架選出一個datanode,然後再從另外的機架選出另外兩個datanode,然後namenode會將選出的三個datanode按距離組建一個順序,然後將順序返回給客戶端;

  3、客戶端會根據返回的三個節點和第一個節點建立一個socket連接(只會和第一個節點建立),第一個節點又會和第二個節點建立socket連接,由第二個節點又會和第三個節點建立一個socket連接,這種連接的方式叫Pipeline;

  4、客戶端會將block切分成package(默認是64kB),以流式在pipeline中傳輸

好處:

   (1)速度快:時間線重疊(其實流式也是一種變異的並行);

   (2)客戶端簡單:副本的概念是透明的;

  5、由DataNode完成接收block塊後,block的metadata(MD5校驗用)通過一個心跳將信息彙報給NameNode;

  6、如果再pipeline傳輸中,任意節點失敗,上游節點直接連接失敗節點的下游節點繼續傳輸,最終在第5步彙報後,NameNode會發現副本數不足,一定會觸發DataNode複製更多副本,客戶端Client副本透明;

  7、client一直重複以上操作,逐一將block塊上傳,同時DataNode彙報block的位置信息,時間線重疊;

  8、最終,如果NameNode收到了DataNode彙報的所有塊的信息,將文件的.copying去掉,文件可用。

HDFS的讀流程


HDFS 讀寫流程(詳解)


讀流程如下:

  我們先說一個語義:下載回這個文件。換句話說就是取回這個文件的所有的塊,那麼當有能力取回文件的所有塊的時候,那麼它的子集操作就是取回其中某些塊或者某個塊也能實現。所以我們先來看取回文件的所有塊的流程是怎麼實現的:

 1、客戶端和NameNode建立連接,獲取文件block的位置信息(fileBlockLocations)

 2、客戶端根據自己想要獲取的數據位置挑選需要連接的DataNode(如果全文下載,從0開始;如果是從某一位置開始,客戶端需要給出)

需要用inputstream.seek(long)//從什麼位置開始讀取,和哪個DataNode開始連接獲取block;

 3、距離的概念:只有文件系統在讀流程中附加距離優先的概念,計算層才能夠被動實現計算向數據移動,距離有以下三種:

  (1)本地,最近的距離;

  (2)同機架,次之的距離;

  (3)other(數據中心),最遠的距離;

 4、客戶端下載完成block後會驗證DataNode中的MD5,保證塊數據的完整性。

看到了這裡,你會發現 HDFS 文件系統的讀寫流程並不複雜,很容易被小夥伴們忽略,所以趕緊mark起來吧!

我是大數據每日嗶嗶,歡迎關注我,一起聊大數據!


分享到:


相關文章: