詳細步驟解析:
1、 client發起檔案上傳請求,通過rpc與namenode建立通訊,namenode檢查目標檔案是否已存在,父目錄是否存在,返回是否可以上傳;
2、 client請求第乙個block該傳輸到哪些datanode伺服器上;
3、 namenode根據配置檔案中指定的備份數量及機架感知原理進行檔案分配,返回可用的datanode的位址如:a,b,c;
4、 client請求3臺datanode中的一台a上傳資料(本質上是乙個rpc呼叫,建立pipeline),a收到請求會繼續呼叫b,然後b呼叫c,將整個pipeline建立完成,後逐級返回client;
5、 client開始往a上傳第乙個block(先從磁碟讀取資料放到乙個本地記憶體快取),以packet為單位(預設64k),a收到乙個packet就會傳給b,b傳給c;a每傳乙個packet會放入乙個應答佇列等待應答。
6、 資料被分割成乙個個packet資料報在pipeline上依次傳輸,在pipeline反方向上,逐個傳送ack(命令正確應答),最終由pipeline中第乙個datanode節點a將pipelineack傳送給client;
7、關閉寫入流。
8、 當乙個block傳輸完成之後,client再次請求namenode上傳第二個block到伺服器
rpc 指的是 遠端過程呼叫。是集群中多個元件、多個模組進行資料通訊的一種方式。
詳細步驟解析
1、客戶端通過呼叫filesystem物件的open()來讀取希望開啟的檔案。
2、 client向namenode發起rpc請求,來確定請求檔案block所在的位置;
3、 namenode會視情況返回檔案的部分或者全部block列表,對於每個block,namenode 都會返回含有該 block 副本的 datanode 位址; 這些返回的 dn 位址,會按照集群拓撲結構得出 datanode 與客戶端的距離,然後進行排序,排序兩個規則:網路拓撲結構中距離 client 近的排靠前;心跳機制中超時匯報的 dn 狀態為 stale,這樣的排靠後;
4、 client 選取排序靠前的 datanode 來讀取 block,如果客戶端本身就是datanode,那麼將從本地直接獲取資料(短路讀取特性);
5、 底層上本質是建立 socket stream(fsdatainputstream),重複的呼叫父類 datainputstream 的 read 方法,直到這個塊上的資料讀取完畢;
6、並行讀取,若失敗重新讀取
7、 當讀完列表的 block 後,若檔案讀取還沒有結束,客戶端會繼續向namenode 獲取下一批的 block 列表;
8、返回後續block列表
9、 最終關閉讀流,並將讀取來所有的 block 會合併成乙個完整的最終檔案。
說明:
1、讀取完乙個 block 都會進行 checksum 驗證,如果讀取 datanode 時出現錯誤,客戶端會通知 namenode,然後再從下乙個擁有該 block 副本的datanode 繼續讀。
2、read 方法是並行的讀取 block 資訊,不是一塊一塊的讀取;namenode 只是返回client請求包含塊的datanode位址,並不是返回請求塊的資料;
當datenode讀取block的時候,它會計算checksum
如果計算後的checksum,與block建立時(第一次上傳時會計算checksum值)值不一樣,說明block已經損壞。
client讀取其他datenode上的block。
datenode在其檔案建立後週期驗證checksum
datenode程序死亡或者網路故障造成datenode無法與namenode通訊,namenode不會立即把該節點判定為死亡,要經過一段時間,這段時間稱為超時時長。hdfs預設的超時時長為10分鐘+30秒。如果定義超時時長為timeout,則超時時長的計算公式為:timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。而預設的 dfs.namenode.heartbeat.recheck-interval 大小為5分鐘,dfs.heartbeat.interval 預設為3秒。
需要注意的是hdfs-site.xml 配置檔案中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。
dfs.namenode.heartbeat.recheck-interval
300000
dfs.heartbeat.interval
3
和namenode不同的是,datenode的儲存目錄是初始階段自動建立的,不需要額外格式化。在**/export/servers/hadoop-2.6.0-cdh5.14.0/hadoopdatas/datanodedatas/current**這個目錄下檢視版本號
[root@node01 current]
# cat version
#thu mar 14 07:58:46 cst 2019
storageid=ds-47bcc6d5-c9b7-4c88-9cc8-6154b8a2bf39
clusterid=cid-dac2e9fa-65d2-4963-a7b5-bb4d0280d3f4
ctime=0
datanodeuuid=c44514a0-9ed6-4642-b3a8-5af79f03d7a4
storagetype=data_node
layoutversion=-56
具體解釋storageid:儲存id號
clusterid:集群id全域性唯一
ctime:屬性標記了datenode儲存系統建立時間,對於剛剛格式化的儲存系統,這個屬性為0;但是在檔案系統公升級之後,該值會更新到新的時間戳
datenodeuuid:datenode的唯一標識
storagetype:儲存型別
layoutversion:是乙個負整數。通常只有hdfs增加新特性時才會更新這個版本號
hdfs是設計成適應一次寫入,多次讀出的場景,且不支援檔案的修改。正因為如此,hdfs適合用來做大資料分析的底層儲存服務,並不適合用來做網盤等應用,因為修改不方便,延遲大,網路開銷大,成本太高。
hdfs讀寫流程 HDFS 檔案讀寫流程
開啟分布式檔案 呼叫分布式檔案 distributedfilesystem.open 方法 定址請求 從 namenode 處得到 datanode 的位址,distributedfilesystem使用 rpc 方式呼叫了namenode,namenode 返回存有該副本的datanode 位址,...
HDFS檔案讀寫流程
1.1 命令 hadoop fs put log user 1.2 流程圖 注意 檔案寫流程是 fsdataoutputstream 不是 fsdatainputstream。1.3 詳細過程 client 呼叫 filesystem.create filepath 方法,與 nn 進行 rpc 通...
hdfs讀寫流程 HDFS 讀寫流程(詳解)
hdfs hadoop distributed file system 是gfs的開源實現。1 優點 因為有多個副本,可以保證資料可靠,容錯性高 計算向資料移動,適用於批處理 適合大資料處理,gb tb pb級資料,百萬以上的檔案,十萬以上的節點 可以構建在廉價機器上,通過多副本提高可靠性 2 缺點...