一、HDFS讀取文件流程:
詳解讀取流程:
Client調用FileSystem.open()方法:
1 FileSystem通過RPC與NN通信,NN返回該文件的部分或全部block列表(含有block拷貝的DN地址)。
2 選取舉栗客戶端最近的DN建立連接,讀取block,返回FSDataInputStream。
Client調用輸入流的read()方法:
1 當讀到block結尾時,FSDataInputStream關閉與當前DN的連接,並未讀取下一個block尋找最近DN。
2 讀取完一個block都會進行checksum驗證,如果讀取DN時出現錯誤,客戶端會通知NN,然后再從下一個擁有該block拷貝的DN繼續讀。
3 如果block列表讀完后,文件還未結束,FileSystem會繼續從NN獲取下一批block列表。
關閉FSDataInputStream
二、HDFS文件寫入流程:
詳細寫入流程:
Client調用FileSystem的create()方法:
1 FileSystem向NN發出請求,在NN的namespace里面創建一個新的文件,但是並不關聯任何塊。
2 NN檢查文件是否已經存在、操作權限。如果檢查通過,NN記錄新文件信息,並在某一個DN上創建數據塊。
3 返回FSDataOutputStream,將Client引導至該數據塊執行寫入操作。
Client調用輸出流的write()方法:
HDFS默認將每個數據塊放置3份。FSDataOutputStream將數據首先寫到第一節點,第一節點將數據包傳送並寫入第二節點,第二節點 --> 第三節點。
Client調用流的close()方法:
flush緩沖區的數據包,block完成復制份數后,NN返回成功消息。