1. 程式人生 > >HDFS讀檔案

HDFS讀檔案

    1、首先呼叫FileSystem.open()方法,獲取到DistributedFileSystem例項

    2、DistributedFileSystem通過RPC(遠端過程呼叫)獲得檔案的開始部分或全部block列表,對於每個返回的塊,都包含塊所在的DataNode地址。這些DataNode會按照Hadoop定義的叢集拓撲結構得出客戶端的距離,然後再進行排序。

    如果客戶端本身就是一個DataNode,那麼他將從本地讀取檔案。

  3、DistributedFileSystem會向客戶端返回一個支援檔案定位的輸入流物件FSDataInputStream,用於客戶端讀取資料。FSDataInputStream包含一個DFSInputStream物件,這個物件用來管理DataNode和NameNode之間的I/O

    4、客戶端呼叫read()方法,DFSInputStream就會找出離客戶端最近的datanode並連線datanode

    5、DFSInputStream物件中包含檔案開始部分的資料塊所在的DataNode地址,首先它會連線包含檔案第一個塊最近DataNode。隨後,在資料流中重複呼叫read()函式,直到這個塊全部讀完為止。

    如果第一個block塊的資料讀完,就會關閉指向第一個block塊的datanode連線,接著讀取下一個  block塊

  6、如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的block塊都讀完,這時就會關閉掉所有的流。

     HDFS會考慮在讀取中節點出現故障的情況。目前HDFS是這樣處理的:如果客戶端和所連線的DataNode在讀取時出現故障,那麼它就會去嘗試連線儲存這個塊的下一個最近的DataNode,同時它會記錄這個節點的故障。這樣它就不會再去嘗試連線和讀取塊。客戶端還會驗證從DataNode傳送過來的資料校驗和。如果發現一個損壞的塊,那麼客戶端將會再嘗試從別的DataNode讀取資料塊,向NameNode報告這個資訊,NameNode也會更新儲存的檔案資訊。