Hadoop之HDFS檔案讀寫流程說明

13545163656發表於2018-05-21
HDFS檔案讀寫流程說明

一、檔案讀流程說明
讀取操作是對於Cient端是透明操作,感覺是連續的資料流


1、Client 透過FileSystem.open(filePath)方法,去與NameNode進行RPC通訊,返回該檔案的部分
或全部block列表,也就是返回FSDatainputstream物件;
2、Client呼叫FSDatainputStream物件的read()方法;
     a. 去與第一個最近的DN進行read,讀取完後會check;如果ok會關閉與當前的DN通訊;check fail
     會記錄失敗的block+DN資訊下次不會讀,然後去讀取第二個DN地址
     b. 第二個塊最近的DN上進行讀取,check後關閉與DN通訊
     c. block列表讀取完了,檔案還沒有結束,FileSystem會從NameNode獲取下一批的block列表;
3、Client條用FSDatainput物件的close方法,關閉輸入流;

總結
         client > filesystem.open()與NameNode進行RPC通訊返回get block list

         client > 呼叫inputstream物件read()方法
            if ok  > 關閉DN通訊呼叫inputstream.close()方法關閉輸入流
            if fail  > 記錄DN和block資訊,向第二個DN去讀取最後close();
       block列表read out file over year > filesystem獲取下一批block列表

、檔案寫流程說明



1、Client呼叫FileSystem.create(filepath)方法,與NameNode進行RPC通訊,check該路徑的檔案是否存在和是否有建立該檔案許可權,假如ok就建立一個新檔案,但並不關聯任何的block,返回一個FSDataOutputStream物件;
2、Client呼叫FSDataOutputStream物件的write()方法,將第一個塊寫入第一個DataName,依次傳給第二個節點,第三個節點,第三個節點寫完返回一個ack packet給第二個節點,第二個節點返回第一個節點,第一個節點返回給ack packet給FSDataOutputstream物件,意味著第一個塊寫完,副本數為3;後面剩餘塊依次這樣寫;
3、檔案寫入資料完成後,Client呼叫FSDataOutputStream.close()方法,關閉輸出流,重新整理快取區的資料包;
4、最後呼叫FileSystem.complate()方法,告訴NameNode節點寫入成功;

總結:File.System.create()方法 > NameNode  check(qx and exists )
         if ok > 返回 FSDataOutStream物件 | if fail > return error
        client 呼叫FSDataOutstream.write()方法  >  寫入DN,teturn ack packet > FSDataOutStream物件
        client 呼叫FSDataOutstream.close()方法關閉輸出流  >flush快取
        最後FileSystem.complate() 方法  >  NameNode write ok
       







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31441024/viewspace-2154856/,如需轉載,請註明出處,否則將追究法律責任。

相關文章