1. 程式人生 > >HDFS基礎

HDFS基礎

edi 其中 blocks item filesyste 排序 復制 sim aid

hdfs原理,以及各個模塊的作用

Client:切分文件;訪問或通過命令行管理HDFS;與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數據。 

NameNode:Master節點,只有一個,管理HDFS的名稱空間和數據塊映射信息;配置副本策略;處理客戶端請求。 

DataNode:Slave節點,存儲實際的數據;執行數據塊的讀寫;匯報存儲信息給NameNode。

Secondary NameNode:輔助NameNode,分擔其工作量;定期合並fsimage和fsedits,推送給NameNode;緊急情況下,可輔助恢復NameNode,但Secondary NameNode並非NameNode的熱備。

Hdfs文件讀取

1.首先調用FileSystem對象的open方法,其實是一個DistributedFileSystem的實例 

2.DistributedFileSystem通過rpc獲得文件的第一批個block的locations,同一block按照重復數會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面. 

3.前兩步會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數據流。客戶端調用read方法,DFSInputStream最會找出離客戶端最近的datanode並連接。 

4.數據從datanode源源不斷的流向客戶端。 5.如果第一塊的數據讀完了,就會關閉指向第一塊的datanode連接,接著讀取下一塊。這些操作對客戶端來說是透明的,客戶端的角度看來只是讀一個持續不斷的流。 6.如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的塊都讀完,這時就會關閉掉所有的流。

Hdfs的文件寫入

1.客戶端通過調用DistributedFileSystem的create方法創建新文件 

2.DistributedFileSystem通過RPC調用namenode去創建一個沒有blocks關聯的新文件,創建前,namenode會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,namenode就會記錄下新文件,否則就會拋出IO異常. 

3.前兩步結束後會返回FSDataOutputStream的對象,和讀文件的時候相似,FSDataOutputStream被封裝成DFSOutputStream,DFSOutputStream可以協調namenode和datanode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,然後排成隊列data quene。 4.DataStreamer會去處理接受data quene,他先問詢namenode這個新的block最適合存儲的在哪幾個datanode裏,比如重復數是3,那麽就找到3個最適合的datanode,把他們排成一個pipeline.DataStreamer把packet按隊列輸出到管道的第一個datanode中,第一個datanode又把packet輸出到第二個datanode中,以此類推。 5.DFSOutputStream還有一個對列叫ack quene,也是有packet組成,等待datanode的收到響應,當pipeline中的所有datanode都表示已經收到的時候,這時akc quene才會把對應的packet包移除掉。 6.客戶端完成寫數據後調用close方法關閉寫入流 7.DataStreamer把剩余得包都刷到pipeline裏然後等待ack信息,收到最後一個ack後,通知datanode把文件標示為已完成。

Hdfs的塊存儲位置放置機制

如果寫請求方所在機器是其中一個datanode,則直接存放在本地,否則隨機在集群中選擇一個datanode. 

第二個副本存放於不同第一個副本的所在的機架. 

第三個副本存放於第二個副本所在的機架,但是屬於不同的節點.

Hdfs的塊的流水式復制

當客戶端寫數據到HDFS文件中時,如上所述,數據首先被寫入本地文件中,假設HDFS文件的復制因子是3,當本地文件堆積到一塊大小的數據,客戶端從名字節點獲得一個數據節點的列表。這個列表也包含存放數據塊副本的數據節點。當客戶端刷新數據塊到第一個數據節點。第一個數據節點開始以4kb為單元接收數據,將每一小塊都寫到本地庫中,同時將每一小塊都傳送到列表中的第二個數據節點。同理,第二個數據節點將小塊數據寫入本地庫中同時傳給第三個數據節點,第三個數據節點直接寫到本地庫中。一個數據節點在接前一個節點數據的同時,還可以將數據流水式傳遞給下一個節點,所以,數據是流水式地從一個數據節點傳遞到下一個。

HDFS基礎