HDFS讀檔案
阿新 • • 發佈:2018-11-08
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塊都讀完,這時就會關閉掉所有的流。