1. 程式人生 > 其它 >HDFS讀寫流程

HDFS讀寫流程

兩個重要概念:

NameNode:領導級別。管理資料塊對映;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
 
DataNode:員工級別。負責儲存客戶端發來的資料塊block;執行資料塊的讀寫操作。

寫流程

寫詳細步驟:
1、首先向namenode通訊,請求上傳檔案,namenode檢查目標檔案是否已存在,父目錄是否存在 ,還得看看是否有上傳的許可權,說白了,就是判斷是否可以上傳
2、namenode返回是否可以上傳 ,如果可以,client會先對檔案進行切分(邏輯切分)
3、客戶端請求第一個 Block上傳到哪幾個DataNode伺服器上。
4、NameNode返回3個DataNode節點,分別為dn1、dn2、dn3。
5、客戶端通過FSDataOutputStream模組請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然後dn2呼叫dn3,將這個通訊管道建立完成。
6、dn1、dn2、dn3逐級應答客戶端。
7、客戶端開始往dn1上傳第一個Block(先從磁碟讀取資料放到一個本地記憶體快取),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答佇列等待應答。
8、當一個Block傳輸完成之後,客戶端再次請求NameNode上傳第二個Block的伺服器。(重複執行3-7步)。
9、傳輸完畢之後,客戶端關閉流資源,並且會告訴hdfs資料傳輸完畢,然後hdfs收到傳輸完畢就恢復元資料

具體概念介紹

Distributed FileSystem:進行抽象封裝,FileSystem會利用JDK的反射機制建立一個DistributedFileSystem例項(物件),然後呼叫它的initialize()方法

邏輯切分:客戶端並沒有將檔案真正切分,只是畫了個標誌線加以區分

寫操作,上傳檔案,所以本地是輸入流,hdfs是輸出流

第三步有哪幾個DataNode伺服器上:這裡指副本數,設定了幾個副本,就返回幾個DataNode(記住資料是儲存在DataNode)我設定了三個副本,所以,返回三個;

同時,返回的DataNode也有一定規矩,首先第一個DataNode是距離客戶端最近的,後兩個是根據第一個選出,產生了兩個問題,如何判斷最近,以及如何根據第一個選,這個請看: 拓撲距離和機架感知.

第七步,packet為單位,每個64KB

傳輸Packet:dn1收到之後,一邊往本地落盤,一邊傳給dn2,之後的dn2同理,當dn3落盤結束之後,它將成功資訊發給dn2,之後dn2需要等自己成功並且收到dn3成功資訊之後,將成功資訊發給dn1,同理,dn1在接收到dn2成功資訊並且自己落盤成功之後發給客戶端,此時一個packet就成功了;注意packet不是逐個發的,是一個佇列同時發的,成功了,在佇列裡刪除掉,這樣全部packet發完,第一塊就傳完了,接著傳第二塊,第二次選擇的DataNode可能和第一次一樣,也可能不一樣

傳輸過程中幾種失敗可能:

1.在建立通道時失敗,這樣直接上傳失敗,直接拋異常
2.在傳輸資料過程中失敗:
1).客戶端傳輸Packet到第一個DataNode過程中失敗就上傳失敗
2)dn1與dn2或者dn2與dn3之間的傳輸Packet失敗,上傳仍然進行,並且傳出成功訊號,因為即使這兩個過程失敗了,副本數就變成1了,hdfs有高容錯性,副本丟失,第一個DataNode會觸發自動備份,自動尋找兩個DataNode

讀流程

1)客戶端通過Distributed FileSystem向NameNode請求下載檔案,NameNode通過查詢元資料,找到檔案塊所在的DataNode地址。
2)挑選一臺DataNode(就近原則,然後隨機)伺服器,請求讀取資料。
3)DataNode開始傳輸資料給客戶端(從磁盤裡面讀取資料輸入流,以Packet為單位來做校驗)。
4)客戶端以Packet為單位接收,先在本地快取,然後寫入目標檔案。
5)下載完第一塊,在重複上面2.3步下載

讀寫過程,資料完整性如何保持

通過校驗和。因為每個chunk中都有一個校驗位,一個個chunk構成packet,一個個packet最終形成block,故可在block上求校驗和。

HDFS 的client端即實現了對 HDFS 檔案內容的校驗和 (checksum) 檢查。當客戶端建立一個新的HDFS檔案時候,分塊後會計算這個檔案每個資料塊的校驗和,此校驗和會以一個隱藏檔案形式儲存在同一個 HDFS 名稱空間下。當client端從HDFS中讀取檔案內容後,它會檢查分塊時候計算出的校驗和(隱藏檔案裡)和讀取到的檔案塊中校驗和是否匹配,如果不匹配,客戶端可以選擇從其他 Datanode 獲取該資料塊的副本。

HDFS中檔案塊目錄結構具體格式如下:

${dfs.datanode.data.dir}/
├── current
│ ├── BP-526805057-127.0.0.1-1411980876842
│ │ └── current
│ │ ├── VERSION
│ │ ├── finalized
│ │ │ ├── blk_1073741825
│ │ │ ├── blk_1073741825_1001.meta
│ │ │ ├── blk_1073741826
│ │ │ └── blk_1073741826_1002.meta
│ │ └── rbw
│ └── VERSION
└── in_use.lock

in_use.lock表示DataNode正在對資料夾進行操作
rbw是“replica being written”的意思,該目錄用於儲存使用者當前正在寫入的資料。
Block元資料檔案(*.meta)由一個包含版本、型別資訊的標頭檔案和一系列校驗值組成。校驗和也正是存在其中。