客戶端與HDFS交互過程的實現:
首先,客戶端通過調用FileSystem對象中的open()函數來讀取它需要的數據,FileSystem是HDFS中DistributedFileSystem的一個實例。DistributedFileSystem會通過RPC協議調用NameNode來確定請求文件塊所在的位置。NameNode只會返回所調用文件中開始的幾個塊而不是全部返回。隨後,這些返回的DataNode會按照Hadoop定義集羣拓撲結構得出客戶端的距離,然後在排序。如果客戶端本身就是一個DataNode,那麼他將從本地讀取文件。
其次,DistributedFileSystem迴向客戶端返回一個支持文件定位的輸入流對象FSDataInputSream,用於給客戶端讀取數據。FSDataInputStream包含一個DFSInputStream對象,這個對象用來管理DataNode和NameNode之間的I/O。
當以上步驟完成時,客戶端便會在這個輸入流之上調用read()函數,DFSInputStream對象中包含文件開始部分的數據塊所在的DataNode地址,首先它會連接包含文件第一個塊最近的DataNode。隨後,在數據流中重複調用read()函數,直到這個塊全部讀完爲止。當最後一個塊讀取完畢時,DFSInputStream會關閉連接,並查找存儲下一個數據塊距離客戶端最近的DataNode。以上這些步驟對客戶端來說都是透明的。
客戶端按照DFSInputStream打開和DataNode鏈接返回的數據流的順序讀取該快,她也會調用NameNode來檢索下一組塊所在的DataNode的位置信息。當客戶端完成所有文件的讀取時,則會在FSDataInputStream中調用close()函數。
HDFS會考慮讀取中節點出現故障的情況。
客戶端通過NameNode引導獲取最合適的DataNode地址,然後直接連接DataNode讀取數據。
一致性模型:
文件系統的一致性模型描述了問價讀寫的可見性。HDFS犧牲了一些POSIX的需求來補償性能,所以有些操作可能會和傳統的文件系統不同。
創建一個文件系統時,它在文件系統的命名空間中是可見的,但是對這個文件的任何寫操作不保證是可見的,即使在數據流已經刷新的情況下,文件的長度很長時間也會顯示爲0。
HDFS提供了是所有緩存和DataNode之間的數據強制同步的方法,這個方法是FSDataOutputStream中的sync()函數。當sync()函數返回成功時,HDFS就可以保證此時寫入的文件數據是一致的並且對於所有新用戶都是可見的。