HDFS數據存儲
HDFS client上傳數據到HDFS時,首先,在本地緩存數據,當數據達到一個block大小時。請求NameNode分配一個block。
NameNode會把block所在的DataNode的地址告訴HDFS client。 HDFS client會直接和DataNode通信,把數據寫到DataNode節點一個block文件里。
核心類DistributedFileSystem
HDFS寫數據流程

客戶端要向HDFS寫數據,首先要跟namenode通信以確認可以寫文件並獲得接收文件block的datanode,然后,
客戶端按順序將文件逐個block傳遞給相應datanode,並由接收到block的datanode負責向其他datanode復制block的副本。
具體流程如下:
1、與namenode通信請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在
2、namenode返回是否可以上傳
3、client請求第一個 block該傳輸到哪些datanode服務器上
4、namenode返回3個datanode服務器ABC
5、client請求3台dn中的一台A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然后B調用C,將整個pipeline建立完成,逐級返回客戶端
6、client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位,A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答
7、當一個block傳輸完成之后,client再次請求namenode上傳第二個block的服務器。
HDFS讀數據流程

1、 讀取文件名稱
2、 向namenode獲取文件第一批block位置,這個block會根據副本數返回對應數量的locations數,依據網絡拓撲結構排序,距離client端的排在前面,
從原理來說,是通過DistributedFileSystem對象調用getFileBlockLocations來獲取locations
3、 獲取距離clinet最近的datanode並與其建立通信,數據會源源不斷的寫入clinet端,假設第一個block讀取完成,則關閉指向該datanode的連接,接着讀取下一個block,以此類推。
假設所有的塊都讀取完了,則把所有的流都關閉。
實際上,也是通過DistributedFileSystem來open一個流對象,將其封裝到DFSInputStream對象當中,block讀取可以查看接口BlockReader.
4、如果讀取的過程出現DN出現異常(比如通信異常),則會嘗試去讀取第二個優先位置的datanode,並且記錄該錯誤的datanode,剩余的blocks讀取的時候直接跳過該datanode
DFSInputStream也會檢查block數據校驗和,假設發現一個壞的block,就會先報告到namenode節點,然后DFSInputStream在其它的datanode上讀該block的鏡像。
