標籤:
HDFS簡單介紹
HDFS全稱是Hadoop Distribute File System,是一個能運行在普通商用硬體上的Distributed File System。
與其他Distributed File System顯著不同的特點是:
- HDFS是一個高容錯系統且能運行在各種低成本硬體上;
- 提供高輸送量,適合於儲存大資料集;
- HDFS提供流式資料訪問機制。
HDFS起源於Apache Nutch,現在是Apache Hadoop項目的核心子項目。
HDFS設計假設和目標
- 硬體錯誤是常態
在資料中心,硬體異常應被視作常態而非異常態。
在一個大資料環境下,hdfs叢集有大量物理機器構成,每台機器由很多硬體組成,整個因為某一個組件出錯而出錯的幾率是很高的,
因此HDFS架構的一個核心設計目標就是能夠快速檢測硬體失效並快速從失效中恢複工作。
- 流式訪問要求
在HDFS叢集上啟動並執行應用要求流式訪問資料,HDFS設計為適用於批處理而非互動式處理,因此在架構設計時更加強調高輸送量而非低延遲。
對於POSIX的標準訪問機制比如隨機訪問會嚴重降低輸送量,HDFS將忽略此機制。
- 大資料集
假定HDFS的典型檔案大小是GB甚至TB大小的,HDFS設計重點是支援大檔案,支援通過機器數量擴充以支援更大的叢集,
單個叢集應提供海量檔案數量支援
- 簡單一致性模型
HDFS提供的訪問模型是一次寫入多次讀取的模型。寫入後檔案保持原樣不動簡化了資料一致性模型並且對應用來說,它能得到更高的輸送量。
檔案追加也支援。
- 移動計算比移動資料代價更低
HDFS利用了電腦系統的資料本地化原理,認為資料離CPU越近,效能更高。
HDFS提供介面讓應用感知資料的實體儲存體位置。
- 異構軟硬體平台相容
HDFS被設計成能方便的從一個平台遷移到另外一個平台
HDFS適用情境
綜合上述的設計假設和後面的架構分析,HDFS特別適合於以下情境:
HDFS架構
本文將從以下幾個方面分析HDFS架構,探討HDFS架構是如何滿足設計目標的。
HDFS總體架構
下面這張HDFS架構圖來自於hadoop官方網站.
從這上面可以看出,HDFS採取主從式C/S架構,HDFS的節點分為兩種角色:
HDFS資料群組織機制
HDFS的資料群組織分成兩部分進行理解,首先是NameNode部分,其次是DataNode資料部分,資料的組織圖如下所示:
- NameNode
基於Yarn架構的HDFS中,NameNode採取主從式設計,主機主要負責用戶端訪問中繼資料的要求,以及儲存塊資訊。
從機主要負責對主機進行即時備份,同時定期將使用者操作記錄以及檔案記錄歸併到Block Storage裝置,並將其回寫到主機。
當主機失效時,從機接管主機所有的工作。 主從NameNode協同工作方式如下:
Technorati 標記: HDFS,hadoop,NameNode,大資料,架構
- DataNode
DataNode負責儲存真正的資料。DataNode中檔案以資料區塊為基礎單位,資料區塊大小固定。整個叢集中,同一個資料區塊
將被儲存多份,分別儲存在不同的DataNode當中。其中資料區塊大小,副本個數由hadoop的設定檔參數確定。資料區塊大小、
副本個數在叢集啟動後可以修改,修改後的參數重啟之後生效,不影響現有的檔案。
DataNode啟動之後會掃描本地檔案系統中物理塊個數,並將對應的資料區塊資訊彙報給NameNode。
HDFS資料訪問機制
HDFS的檔案訪問機製為流式訪問機制,即通過API開啟檔案的某個資料區塊之後,可以順序讀取或者寫入某個檔案,不可以指定
讀取檔案然後進行檔案操作。
由於HDFS中存在多個角色,且對應應用情境主要為一次寫入多次讀取的情境,因此其讀和寫的方式有較大不同。讀寫操作都由
用戶端發起,並且進行整個流程的控制,伺服器角色(NameNode和DataNode)都是被動式響應。
下面分別對其進行 介紹:
- 讀取流程
用戶端發起讀取請求時,首先與Namenode機進行串連,串連時同樣需要hdfs設定檔,因此其知道各伺服器相關資訊。串連建立
完成後,用戶端請求讀取某個檔案的某一個資料區塊,NameNode在記憶體中進行檢索,查看是否有對應的檔案以及檔案塊,若沒有
則通知用戶端對應檔案或塊不存在。若有則通知用戶端對應的資料區塊存在哪些伺服器之上,用戶端確定收到資訊之後,與對應的資料
接連串連,並開始進行網路傳輸。用戶端任意選擇其中一個副本資料進行讀操作。
流程分析 ?使用HDFS提供的用戶端開發庫Client,向遠端Namenode發起RPC請求;
? Namenode會視情況返迴文件的部分或者全部block列表,對於每個block,Namenode都會返回有該block拷貝的DataNode地址;
?用戶端開發庫Client會選取離用戶端最接近的DataNode來讀取block;如果用戶端本身就是DataNode,那麼將從本地直接擷取資料.
?讀取完當前block的資料後,關閉與當前的DataNode串連,並為讀取下一個block尋找最佳的DataNode;
?當讀完列表的block後,且檔案讀取還沒有結束,用戶端開發庫會繼續向Namenode擷取下一批的block列表。
?讀取完一個block都會進行checksum驗證,如果讀取datanode時出現錯誤,用戶端會通知Namenode,然後再從下一個擁有該block拷貝的datanode繼續讀。
- 寫入流程
用戶端發起寫入求時,NameNode在記憶體中進行檢索,查看是否有對應的檔案以及檔案塊,若有 則通知用戶端對應檔案或塊已存在,
若沒有則通知用戶端某台伺服器作為寫入主伺服器。NameNode同時通知寫入主伺服器就緒,用戶端與主伺服器進行通訊並寫入資料時,
主寫入伺服器寫入資料到物理磁碟,寫入完成之後與NameNode通訊擷取其下一個複本伺服器地址,確認地址之後將資料傳遞給它,這樣
進行接力棒式寫入,一直到達設定副本數目為止,等最後一個副本寫完成,則同樣將寫入成功失敗情況以接力棒方式返回給用戶端,最後
用戶端通知NameNode資料區塊寫入成功,若其中某台失敗則整個寫入失敗。
流程分析
?使用HDFS提供的用戶端開發庫Client,向遠端Namenode發起RPC請求;
?Namenode會檢查要建立的檔案是否已經存在,建立者是否有許可權進行操作,成功則會為檔案 建立一個記錄,否則會讓用戶端拋出異常;
?當用戶端開始寫入檔案的時候,會將檔案切分成多個packets,並在內部以資料隊列"data queue"的形式管理這些packets,並向Namenode申請新的blocks,擷取用來儲存replicas的合適的datanodes列表,列表的大小根據在Namenode中對replication的設定而定。
?開始以pipeline(管道)的形式將packet寫入所有的replicas中。把packet以流的方式寫入第一個datanode,該datanode把該packet儲存之後,再將其傳遞給在此pipeline中的下一個datanode,直到最後一個datanode,這種寫資料的方式呈流水線的形式。
?最後一個datanode成功儲存之後會返回一個ack packet,在pipeline裡傳遞至用戶端,在用戶端的開發庫內部維護著"ack queue",成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet。
?如果傳輸過程中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除,剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設定的數量。
HDFS資料安全機制
HDFS檔案系統的安全機制採取類linux的ACL安全訪問機制。每一個檔案預設繼承其父物件即目錄的存取權限,預設的使用者和屬組來自於
上傳用戶端的使用者。相關控制方法也與linux類似,可以通過命令或者API指定某個使用者對某個檔案的讀寫權限。當使用者沒有對應的許可權時,
若進行檔案讀寫操作將會得到對應的錯誤提示。
HDFS高可用性機制
HDFS作為一個高可用叢集,其可用性設計是非常用心的,主要體現在:
- NameNode主從設計
主從設計保證了中繼資料的可靠,解決了HDFS 1.0中單點故障的問題。具體可以參看上文描述
- 資料副本機制
資料副本機制保證了存放在某台伺服器的檔案塊因為某種原因遭到破壞的時候,整個叢集照樣可以對外提供
檔案訪問服務,具體請參考上文資料訪問機制部分。
- 資料恢複機制
這兒的資料恢複指HDFS提供一定時間的反悔視窗期,預設系統中被刪除的檔案被移動到trash目錄裡面,過了
一段時間之後有HDFS清理掉,此機制在雲端儲存中普遍使用。若某資料區塊失效,通過副本機制則可以恢複。
- 機架感知機制
大型叢集的組織是以機架形式組織的,機器以固定數量伺服器以及對應的網路裝置群組成一個機櫃,一般來說,跨機架的網路IO總是比同一機架更高,當然若跨機房則代價更高。因此HDFS總是想辦法將資料儲存在效能更好的伺服器當中以提升效能,同時會設法將資料儲存到不同機架以保證資料的容錯性。典型機架拓撲和副本如所示:
在應用讀取資料時,HDFS總是選擇離應用更近的伺服器。
- 快照機制
- 自動錯誤偵測恢複機制
機器失效檢測通過心跳檢測完成,若在一段時間內,DataNode或者NameNode不能返回心跳,主NameNode會將其標記為宕機伺服器,此後新的IO請求等將不會被轉寄到此伺服器,同時對應的檔案若有相關檔案因為某台伺服器宕機導致副本數目達不到指定數目,HDFS將重新複製部分檔案副本,以保證整個叢集的可靠性。
- 校正和機制
校正和是指對每一個資料區塊產生一個校正和,當資料被再次讀取時,用戶端對其進行計算並與伺服器上的校正和進行比較,保證了資料不會因為網路傳輸或者其他方式被篡改。
HDFS叢集擴充機制
叢集的動態擴充方式方便使用者以動態方式對叢集進行擴容和縮容。若有新伺服器加入,則後續的IO會有更多的機會被
發送到新伺服器上執行,對叢集中現有檔案的充分分布,可以通過命令進行,但是資料重新分配將只佔用少量網路IO,這樣保證叢集上的應用不會因為重分布而受到重大影響。同樣機器下架也通過命令進行,此時叢集表現出與機器宕機類似情況,會不再往其上發IO請求以及重新複製以保證副本數量。
參考文獻:
- HDFS Design Document
- HDFS 原理、架構與特性介紹
大資料技術hadoop入門理論系列之二—HDFS架構簡介