第十一章 HDFS 的讀寫詳解

HDFS 的寫操作

1)客戶端通過 Distributed FileSystem 模塊向 NameNode 請求上傳文件,NameNode 檢查目標文件是否已存在,父目錄是否存在。

客戶端怎麼知道請求發給那個節點的哪個進程?

因為客戶端會提供一些工具來解析出來你所指定的 HDFS 集群的主節點是誰,以及端口號等信息,主要是通過URI來確定,uri:hdfs://bigdata101:9000

當前請求會包含一個非常重要的信息: 上傳的數據的總大小

2)NameNode返回是否可以上傳。

1 管理元數據(抽象目錄樹結構)

用戶上傳的那個文件在對應的目錄如果存在。那麼HDFS集群應該作何處理,不會處理。

用戶上傳的那個文件要存儲的目錄不存在的話,如果不存在不會創建。

2、響應請求

真正的操作:做一系列的校驗。

1、校驗客戶端的請求是否合理 2、校驗客戶端是否有權限進行上傳

3)如果 namenode 返回給客戶端的結果是 通過, 那就是允許上傳,客戶端請求第一個 Block上傳到哪幾個DataNode 服務器上。

4)NameNode 返回 3 個 DataNode 節點,分別為bigdata101、bigdata102、bigdata103。

5)對要上傳的數據塊進行邏輯切片

切片分成兩個階段:

1、規劃怎麼切 2、真正的切

物理切片: 1 和 2

邏輯切片: 1

file1_blk1 : file1:0:128 file1_blk2 : file1:128:256

  邏輯切片只是規劃了怎麼切

6)客戶端通過 FSDataOutputStream 模塊請求 bigdata101 上傳數據,bigdata101 收到請求會繼續調用bigdata102,然後bigdata102調用bigdata103,將這個通信管道建立完成。

7)bigdata101、bigdata102、bigdata103逐級應答客戶端。

8)客戶端開始往bigdata101上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet為單位,bigdata101收到一個Packet就會傳給bigdata102,bigdata102傳給bigdata103;bigdata101每傳一個packet會放入一個應答隊列等待應答。

9)當一個傳輸完成之後,客戶端再次請求上傳第二個的服務器。(重複執行步)

10)客戶端在意識到所有的數據塊都寫入成功之後,會給 namenode 發送一個反饋,就是告訴 namenode 當前客戶端上傳的數據已經成功。


備註

只要寫入了 dfs.replication.min(最小寫入成功的副本數)的複本數(默認為 1),寫操作 就會成功,並且這個塊可以在集群中異步複製,直到達到其目標複本數(dfs.replication 的默認值為 3),因為 namenode 已經知道文件由哪些塊組成,所以它在返回成功前只需 要等待數據塊進行最小量的複製。

1、block 是最大的一個單位,它是最終存儲於 DataNode 上的數據粒度,由 dfs.block.size 參數決定,2.x版本默認是 128M;注:這個參數由客戶端配置決定;如:System.out.println(conf.get("dfs.blocksize"));//結果是134217728

2、packet 是中等的一個單位,它是數據由 DFSClient 流向 DataNode 的粒度,以 dfs.write.packet.size 參數為參考值,默認是 64K;注:這個參數為參考值,是指真正在進行數據傳輸時,會以它為基準進行調整,調整的原因是一個 packet 有特定的結構,調整的目標是這個 packet 的大小剛好包含結構中的所有成員,同時也保證寫到 DataNode 後當前 block 的大小不超過設定值;

如:System.out.println(conf.get("dfs.write.packet.size"));//結果是65536

3、chunk 是最小的一個單位,它是 DFSClient 到 DataNode 數據傳輸中進行數據校驗的粒度,由io.bytes.per.checksum參數決定,默認是512B;注:事實上一個chunk還包含4B的校驗值,因而chunk寫入packet時是516B;數據與檢驗值的比值為128:1,所以對於一個128M的block會有一個1M的校驗文件與之對應;

如:System.out.println(conf.get("io.bytes.per.checksum"));//結果是512


HDFS 的讀操作

1)客戶端通過 Distributed FileSystem 向 NameNode 請求下載文件,NameNode 通過查詢元數據,找到文件塊所在的 DataNode 地址。

2)挑選一臺 DataNode(就近原則,然後隨機)服務器,請求讀取數據。

3)DataNode 開始傳輸數據給客戶端(從磁盤裡面讀取數據輸入流,以 Packet 為單位來做校驗)。

4)客戶端以Packet為單位接收,先在本地緩存,然後寫入目標文件。

5)不斷執行第 1 - 4 步直到數據全部讀完。

6)客戶端調用close ,關閉輸入流DFS InputStream。



分享到:


相關文章: