HDFS設計思想來源於Google三大論文之一的GFS
設計思想
- 分而治之:將大文件、大批量文件,分布式放在大量服務器上,以便於采取分而治之的方式對海量數據進行預算分析;
- 在大數據系統中的作用:為各類分布式運算框架(如:MapReduce,Spark等)提供數據存儲服務
- 重要概念:文件切塊,副本存放,元數據
HDFS架構
HDFS各節點
- NameNode是HDFS的主節點,負責元數據的管理以及客戶端對文件的訪問。管理數據塊的復制,它周期性地從集群中的每個DataNode接收心跳信號和塊狀態報告(Blockreport)
- DataNode是HDFS的從節點,負責具體數據的讀寫,數據的存儲。
DataNode啟動時向NameNode注冊,通過后,周期性(1小時)的向NameNode上報告所有塊信息。心跳是每三秒一次,心跳返回結果帶有NameNode給該DataNode的命令(如復制塊數據到另一台服務器,或刪除某個數據塊。如果超過十分鍾沒有收到某個DataNode的心跳,則認為該節點不可用。
- SecondaryNameNode:負責元數據的同步
- Client(客戶端): 負責數據讀寫請求的發起
文件:
- HDFS中的文件是分塊存儲(block),塊的大小可以通過配置參數(dfs.blocksize)來規定,默認大小在Hadoop2.X版本中是128M,老版本是64M,,每個塊有多個副本存儲在不同的機器上,副本數可在文件生成時指定(默認3)
- NameNode 負責文件元數據的操作,DataNode負責處理文件內容的讀寫請求。
- 數據塊在DataNode以文件存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據(包括數據塊的長度,快數據的效驗以及時間戳)
- 數據塊存放在哪些DataNode上由 NameNode來控制,根據全局情況做出塊放置決定,讀取文件時NameNode盡量讓用戶先讀取最近的副本,降低帶塊消耗和讀取時延。
- 數據塊損壞處理:當DataNode讀取塊的時候,它會計算checksum,如果計算后的checksum與block創建時值不一樣,說明該block已損壞,則認為該節點不可用,客戶端會讀取其它DataNode上的block,NameNode標記該block已經損壞,然后復制其他節點的block達到預期設置的文件備份數(默認每個塊存儲三份,存儲在不同的DataNode節點上)。DataNode在其文件創建三周后驗證其checksum。
NameNode啟動過程:簡述
- 加載fsimage和edits文件,生成新的fsimage和一個空的edits文件
- 等待DataNode注冊和發送心跳
- DataNode啟動,向NameNode注冊,發送心跳報告、塊報告
- NameNode離開安全模式。
NameNode啟動過程:詳解
- Name啟動的時候首先將fsimage(鏡像)載入內存,並執行(replay)編輯日志editlog的的各項操作;
- 一旦在內存中建立文件系統元數據映射,則創建一個新的fsimage文件(這個過程不需 SecondaryNameNode) 和一個空的editlog;
- 在安全模式下,各個datanode會向namenode發送塊列表的最新情況;
- 此刻namenode運行在安全模式。即NameNode的文件系統對於客服端來說是只讀的。(顯示目錄,顯示文 件內容等。寫、刪除、重命名都會失敗);
- NameNode開始監聽RPC和HTTP請求
- 解釋RPC:RPC(Remote Procedure Call Protocol)——遠程過程通過協議,它是一種通過網絡從遠程計算機程序 上請求服務,而不需要了解底層網絡技術的協議;
- 系統中數據塊的位置並不是由namenode維護的,而是以塊列表形式存儲在datanode中;
- 在系統的正常操作期間,namenode會在內存中保留所有塊信息的映射信息。