2014-01-21 69 views

回答

0

你的問題的答案很複雜。在大多數情況下,作爲Hadoop的用戶或者甚至是HDFS的管理員,您可能不需要關心NameNode如何確定要將塊寫入哪個節點。但是,如果你真的很好奇,看看以下資源:

從Hadoop的權威指南的「Anatomy of a File Write」:

客戶端通過調用創建(上 DistributedFileSystem創建文件)(圖3-3中的步驟1)。 DistributedFileSystem 對namenode進行RPC調用,以在 文件系統的名稱空間中創建一個新文件,並且沒有與其關聯的塊(步驟2)。 namenode執行各種檢查以確保該文件不存在 ,並且該客戶端有權創建 該文件。如果這些檢查通過,namenode會記錄新的 文件;否則,文件創建失敗,並拋出IOException異常。 DistributedFileSystem返回一個FSDataOutputStream 供客戶端開始寫入數據。就像在讀取的情況下一樣, FSDataOutputStream封裝了一個DFSOutputStream,它處理與datanodes和namenode的 通信。

當客戶端寫入數據(步驟3)時,DFSOutputStream將其拆分爲 數據包,它將數據寫入內部隊列,稱爲數據隊列。 數據隊列由DataStreamer使用,其責任 它要求namenode通過選擇合適的數據節點列表來分配新塊以存儲副本。數據節點列表形成一個流水線 - 我們假設複製級別爲3,所以在流水線中有三個節點 。 DataStreamer將數據包流式傳輸到管道中的第一個數據節點,即 ,數據包存儲該數據包,然後 將數據包轉發到管道中的第二個數據節點。同樣,第二個datanode存儲數據包並將其轉發給流水線中的第三個數據節點(最後一個數據節點爲 )。

您還可以檢查出從最新的穩定ASF Hadoop的源代碼,如果你想一步通過它: https://github.com/apache/hadoop-common/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DistributedFileSystem.java#L346

+0

感謝你jtravaglini –

相關問題