NameNode並不會將文件的分塊數據持久化存儲,這些信息會在HDFS啟動時由各個dataNode上報過來。他把這些數據存入記憶體中。並且會定時對記憶體中的數據進行快照。所以對於NameNode節點的機器記憶體應該大一些 ...
一、什麼是HDFS
HDFS即Hadoop分散式文件系統(Hadoop Distributed Filesystem),以流式數據訪問模式來存儲超大文件,它和現有的分散式文件系統有很多共同點。但同時,它和其他的分散式文件系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實現流式讀取文件系統數據的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的。
二、HDFS架構
個HDFS集群包含一個單獨的NameNode和多個DataNode。HDFS採用一種稱為rack-aware的策略。Rack1 和Rack2
備份數據的存放:備份數據的存放是HDFS可靠性和性能的關鍵。HDFS採用一種稱為rack-aware的策略來決定備份數據的存放。通過一個稱為Rack Awareness的過程,NameNode決定每個DataNode所屬rack id。預設情況下,一個block塊會有三個備份,一個在NameNode指定的DataNode上,一個在指定DataNode非同一rack的DataNode上,一個在指定DataNode同一rack的DataNode上。這種策略綜合考慮了同一rack失效、以及不同rack之間數據複製性能問題。
副本的選擇:為了降低整體的帶寬消耗和讀取延時,HDFS會儘量讀取最近的副本。如果在同一個rack上有一個副本,那麼就讀該副本。如果一個HDFS集群跨越多個數據中心,那麼將首先嘗試讀本地數據中心的副本。安全模式:系統啟動後先進入安全模式,此時系統中的內容不允許修改和刪除,直到安全模式結束。安全模式主要是為了啟動檢查各個DataNode上數據塊的安全性
三、HDFS核心組件詳解
*********************************************************NameNode**************************************************
1、NameNode是HDFS的核心模塊,也是HDFS架構的master。NomeNode一點宕機則整個HDFS服務不可用。
2、NameNode僅僅存儲HDFS的元數據:文件系統中的文件目錄結構,並且能跟蹤整個集群中的文件。
3、NameNode不存儲實際的文件數據,實際數據是存儲在DataNode中,他存儲的是文件分塊的基礎數據;能通過文件獲取文件的快列表及其分佈在哪些dataNode上。
4、NameNode並不會將文件的分塊數據持久化存儲,這些信息會在HDFS啟動時由各個dataNode上報過來。他把這些數據存入記憶體中。並且會定時對記憶體中的數據進行快照。所以對於NameNode節點的機器記憶體應該大一些。
5、NameNode在hadoop 2.0版本之前是單點的,Hadoop 2.0版本才提出了高可用 (High Availability, HA) 解決方案,並且經過多個版本的迭代更新,已經廣泛應用於生產環境。
*********************************************************DataNode**************************************************
1、DataNode:HDFS的Slave節點,存儲文件實際的數據,負責將數據落入磁碟。所以DataNode節點需要較大的磁碟。
2、DataNode在啟動時會將自己發佈到NameNode上,並上報自己持有的數據塊表。定期向NameNode發送心跳,如果NameNode長時間沒有接受到DataNode發送的心跳,NameNode就會認為該DataNode以及失效,將其剔除集群。心跳參數dfs.heartbeat.interval=3(預設3秒發送一次心跳)
3、當某個DateNode宕機後,不會影響數據和集群的可用性。NameNode會安排其他DataNode進行副本複製接管他的工作。
4、DataNode會定時上報自己負責的數據塊列表。
*********************************************************Secondary NameNode**************************************************
SecondaryNameNode有兩個作用,一是鏡像備份,二是日誌與鏡像的定期合併。兩個過程同時進行,稱為checkpoint. 鏡像備份的作用:備份fsimage(fsimage是元數據發送檢查點時寫入文件);日誌與鏡像的定期合併的作用:將Namenode中edits日誌和fsimage合併,防止如果Namenode節點故障,namenode下次啟動的時候,會把fsimage載入到記憶體中,應用edit log,edit log往往很大,導致操作往往很耗時。
四、HDFS操作流程
**************************************************文件上傳流程******************************************
1、客戶端發起寫文件請求 hadoop fs -put
2、nameNode檢查上傳文件的命名空間是否存在(就是檢測文件目錄結構是否存在),創建者是否有許可權進行操作。然後返回狀態高數客戶端你可以上傳數據
3、客戶端按照分塊配置大小將文件分塊。然後請求NameNode我要上傳blk1,副本數是三個,這個文件一共分割了5塊。
4、NameNode檢測自己管理下的DateNodes是否滿足要求,然後返回給客戶端三台DateNode節點信息(存儲策略是機架模式)。
5、Client端根據返回的DataNode信息選擇一個離自己最近的一個DataNode節點,創建pipeLine(數據傳輸管道),DataNode1->DataNode2創建pipeLine,DataNode2->DataNode3創建pipeLine;DataNode3通過這一串管道傳遞給client數據傳輸管道已經建立完畢。
6、client端創建Stream流(以packet為單位傳輸數據 64kb)上傳數據。
7、DataNode1接受並保持源源不斷的packet,然後把packet源源不斷的傳遞給DataNode2,DataNode2也做相應的操作。
8、DataNode也通過pipeLine發送ACK認證數據是否接收完畢。
9、第一個數據塊上傳完畢後client端開始上傳第二個數據塊
*********************************************************文件的獲取流程****************************************
1、client 發起 hadoop fs -get請求
2、NomeNode檢查該文件的信息,文件的分塊信息和每個分塊所對應哪個DateNode,,以及備份信息和備份信息所在哪個DataNode。把這些信息返回給client端。(返回原則也是機架原則,根據網路拓撲將距離最近的DataNode排在前邊返回)
3、根據NameNode的信息,請求各個文件塊對應的DataNode節點獲取文件數據。
4、合併下載過來的數據塊,形成一個完整的文件。