檔案上傳原理
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iN5UGNlFjY5YzN2QmMlVTY4IjM0U2YhJ2NzIzYhNWZ28CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
原理步驟:
用戶端要向HDFS寫資料,首先要跟namenode通信以确認可以寫檔案并獲得接收檔案block的datanode,然後,用戶端按順序将檔案逐個block傳遞給相應datanode,并由接收到block的datanode負責向其他datanode複制block的副本
根namenode通信請求上傳檔案,namenode檢查目标檔案是否已存在,父目錄是否存在
namenode傳回是否可以上傳
client請求第一個 block該傳輸到哪些datanode伺服器上
namenode傳回3個datanode伺服器ABC
client請求3台dn中的一台A上傳資料(本質上是一個RPC調用,建立pipeline ),
A收到請求會繼續調用B,然後B調用C,将整個pipeline建立完成,逐級傳回用戶端
client開始往A上傳第一個block(先從磁盤讀取資料放到一個本地記憶體緩存),以packet為機關,
A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答
當一個block傳輸完成之後,client再次請求namenode上傳第二個block的伺服器。
檔案下載下傳原理
用戶端将要讀取的檔案路徑發送給namenode,namenode擷取檔案的元資訊(主要是block的存放位置資訊),傳回給用戶端,用戶端根據傳回的資訊找到相應datanode逐個擷取檔案的block并在用戶端本地進行資料追加合并進而獲得整個檔案.
跟namenode通信查詢中繼資料,找到檔案塊所在的datanode伺服器
挑選一台datanode(就近原則,然後随機)伺服器,請求建立socket流
datanode開始發送資料(從磁盤裡面讀取資料放入流,以packet為機關來做校驗)
用戶端以packet為機關接收,先在本地緩存,然後寫入目标檔案