HDFS的寫數(shù)據(jù)流程

1)客戶端通過DistributedFileSystem模塊想NameNode請求上傳文件,NameNode檢查目標文件是否存在,父目錄是否存在。
2)NameNode返回是否可以上傳
3)客戶端請求第一個Block上傳到那幾個DataNode服務器上
4)NameNode返回3哥DataNode節(jié)點,分別為dn1、dn2、dn3
5)客戶端通過FSDataOutputStream模塊請求dn1上傳數(shù)據(jù),dn1收到請求會繼續(xù)吊用dn2,然后dn2調(diào)用dn3,將這個通信管道建立完成
6)dn1、dn2、dn3逐級應答客戶端
7)客戶端開始往dn1上傳第一個Block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個package都會放入一個應答隊列等待應答。
8)當一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務器(重復執(zhí)行3~7步)。
網(wǎng)絡拓撲-節(jié)點距離計算
在HDFS寫數(shù)據(jù)過程中,NameNode會選擇距離上傳數(shù)據(jù)最近距離的DataNode接收數(shù)據(jù)。
節(jié)點距離:兩個節(jié)點到達最近的公共祖先的距離總和。

機架感知-副本存儲節(jié)點選擇
第一個副本在Client所處的節(jié)點上,如果客戶在集群外,隨機選一個。
第一個副本保證速度:
第二個副本在另一個機架的隨機一個節(jié)點。
第二個副本保證可靠性:
第三個副本在第二個副本所在機架的隨機節(jié)點。
第三個副本保證可靠性同時考慮速度。
Crtl + n 查找BlockPlacementPolicyDefault,在該類中查找chooseTargetInOrder方法。該類在hadoop-hafs對應jar包。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.3</version>
</dependency>
HDFS的讀數(shù)據(jù)流程

1)客戶端通過DistributedFileSystem向NameNode請求下載數(shù)據(jù),NameNode通過查詢元數(shù)據(jù),找到文件塊所在的DataNode地址。
2)挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取數(shù)據(jù)。
3)DataNode開始傳輸數(shù)據(jù)給客戶端(從磁盤里面讀取數(shù)據(jù)輸入流,以Packet為單位來做檢驗)。
4)客戶端以Packrt為單位接受,先在本地緩存,然后寫入目標文件。
小結(jié)
本節(jié)是hdfs屬于重點理解部分,注意寫入數(shù)據(jù)是找到一個dn1節(jié)點,dn1一方面將數(shù)據(jù)同步到磁盤,另一方面將數(shù)據(jù)傳給后面dn2;另外要注意的是hdfs的讀數(shù)據(jù)流程是串行讀;另外一個怎樣選擇節(jié)點(同一機器,同一機架,同一網(wǎng)絡)。