1. 程式人生 > >HDFS寫資料的詳細流程

HDFS寫資料的詳細流程

寫資料

1、 client 發起檔案上傳請求,通過 RPC 與 NameNode 建立通訊,NameNode檢查目標檔案是否已存在,父目錄是否存在,返回是否可以上傳;
2、 client 請求第一個 block 該傳輸到哪些 DataNode 伺服器上;
3、 NameNode 根據配置檔案中指定的備份數量及機架感知原理進行檔案分配,返回可用的 DataNode 的地址如:A,B,C;


注:Hadoop 在設計時考慮到資料的安全與高效,資料檔案預設在 HDFS 上存放三份,儲存策略為本地一份,同機架內其它某一節點上一份,不同機架的某一節點上一份。


4、 client 請求 3 臺 DataNode 中的一臺 A 上傳資料(本質上是一個 RPC 呼叫,建立 pipeline),A 收到請求會繼續呼叫 B,然後 B 呼叫 C,將整個pipeline 建立完成,後逐級返回 client;
5、 client 開始往 A 上傳第一個 block(先從磁碟讀取資料放到一個本地記憶體快取),以 packet 為單位(預設 64K),A 收到一個 packet 就會傳給 B,B 傳給 C;A 每傳一個 packet 會放入一個應答佇列等待應答。
6、 資料被分割成一個個 packet 資料包在 pipeline 上依次傳輸,在pipeline 反方向上,逐個傳送 ack(命令正確應答),最終由 pipeline中第一個 DataNode 節點 A 將 pipeline ack 傳送給 client;
7、 當一個 block 傳輸完成之後,client 再次請求 NameNode 上傳第二個block 到伺服器。

讀資料

1)客戶端通過呼叫FileSystem物件中的open()函式來讀取它做需要的資料。FileSystem是HDFS中DistributedFileSystem的一個例項。

2)DistributedFileSystem會通過RPC協議呼叫NameNode來確定請求檔案塊所在的位置。

這裡需要注意的是,NameNode只會返回所呼叫檔案中開始的幾個塊而不是全部返回。對於每個返回的塊,都包含塊所在的DataNode地址。隨後,這些返回的DataNode會按照Hadoop定義的叢集拓撲結構得出客戶端的距離,然後再進行排序。如果客戶端本身就是一個DataNode,那麼它就從本地讀取檔案。其次,DistributedFileSystem會向客戶端返回一個支援檔案定位的輸入流物件FSDataInputStream,用於給客戶端讀取資料。FSDataInputStream包含一個DFSInputStream物件,這個物件用來管理DataNode和NameNode之間的IO。

3)當以上步驟完成時,客戶端便會在這個輸入流上呼叫read()函式。

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

5)當第一個塊讀取完畢時,DFSInputStream會關閉連線,並查詢儲存下一個資料庫距離客戶端最近的DataNode。以上這些步驟對於客戶端來說都是透明的。

6)客戶端按照DFSInputStream開啟和DataNode連線返回的資料流的順序讀取該塊,它也會呼叫NameNode來檢索下一組塊所在的DataNode的位置資訊。當完成所有檔案的讀取時,客戶端則會在DFSInputStream中呼叫close()函式。