本章之後,將對hadoop生態系統各個服務組件進行整理介紹和分析應用。
下面先對hadoop的基礎hdfs文件系統進行介紹。
一、HDFS簡介
hadoop的分佈式文件系統,提供海量數據存儲和訪問。它與現有的分佈式文件系統有很多相似地方,也有很多不同與其他分佈式文件系統的有價值的地方。它能夠提供高容錯機制,能夠運行在廉價計算機硬件上。它能爲應用數據訪問提供高吞吐量,非常適合擁有龐大數據集的應用。HDFS放寬了一些POSIX要求,使其能夠以流式方式訪問文件系統數據。HDFS最開始作爲Apache Nutch項目的基礎設施。現在是Apache hadoop的核心項目的一部分。
高容錯性是HDFS設計的核心。HDFS強調的是高吞吐量而非低延遲。HDFS文件是“一次寫入多次讀取”訪問方式,只能夠在文件末尾追加,不能夠在任意位置修改文件。HDFS爲應用提供了接口來遷移應用自身到數據所在地附近。
HDFS特點:
- 超大存儲。能存儲數以百萬計的文件,每個文件大小可以超過10GB,總存儲量達10PB級。
- 低廉。使用廉價的商業服務器實現大規模存儲。通過應用級數據複製實現高可用性及高吞吐量。
- 批處理。更擅長流式讀寫大文件,而不擅長低延遲訪問大量小文件。更注重批處理,而非交互響應的時間。
- 優雅的處理機器和磁盤故障。
- 支持MapReduce處理。
二、NameNode和DataNode
HDFS是Master/Slave結構。
NameNode(簡稱NN)是HDFS的管理者,它管理HDFS文件系統的命名空間,以及控制客戶端訪問文件。DataNode(簡稱DN)是管理該節點的數據存儲。一個HDFS文件會被劃分爲多個block,分別存儲到多個DN節點上。NN執行對文件系統名字空間的操作,並管理着文件的blocks到DNs的映射。DN響應來至客戶端的讀寫請求。DN執行block的創建、刪除,以及來至NN的複製指令。
HDFS文件系統結構如下圖:
NameNode作用:
- 保存系統名字空間的元數據信息,這些信息保存在fsimage(文件系統鏡像文件)、edit(編輯日誌文件)。
- 接收DN心跳。
- 接收DN上報block位置信息,NN不會永久保存block的位置信息,每次系統啓動時DN都會上報這些信息給NN。
- HDFS目錄配額。
- 文件訪問權限控制。
- 保存文件複製因子。控制DN複製block副本。
- 響應客戶端請求。
- 驗證客戶端身份。
在系統啓動時,NN會進入安全模式,該模式下不會進行數據塊的複製。NN會接收DN心跳及上報的block位置信息。如果一個block的副本數達到了NN記錄的最小副本數,則認爲該block是安全的,當安全的block佔所有block的百分比達到NN記錄的安全百分比時,且安全的DN數達到配置的值時,NN會繼續等待一小段時間默認是30s纔會退出安全模式。然後NN會針對那些沒有達到最小副本數的block,將其複製到其它DN上。如果NN無法退出安全模式,就需要使用hdfs fsck命令檢查哪些block有問題,然後將有問題的文件刪除,才能解決啓動時無法退出安全模式的問題。
安全模式相關一些配置:
- dfs.namenode.replication.min,安全block要求的最小副本數。
- dfs.namenode.safemode.threshold-pct,安全的block佔總block數的百分比,默認0.999f。如果達到1則永遠退不出安全模式;如果配置小於0,則表示不等待任何block達到安全要求。
- dfs.namenode.safemode.min.datanodes,離開安全模式時最小可用的DN數,默認是0。
- dfs.namenode.safemode.extension,單位是毫秒,表示當其他安全條件滿足時,再過一段時間依然滿足安全條件時,才退出安全模式。
NN所在主機如果損毀,整個HDFS文件系統將會損壞,且無法利用DN上的block進行重建。因此,HDFS提供了NN的容災機制:
第一種是備份NN上的文件系統的元數據持久文件。通常做法是NN在寫元數據文件時,同時寫入一個掛載的遠程文件系統 (NFS)。
第二種做法是部署SecondNameNode(簡稱SNN)。SNN的作用是,同步NN的fsimage及edit log文件,定期進行edit 日誌文件合併工作,生成新的fsimage文件,並將新的fsimage文件同步給NN。在NN損毀的情況下,可以使用SNN進行 恢復,但是由於SNN的狀態始終晚於NN,故通過SNN恢復的文件難免會有部分數據丟失的情況。這種情況一般會用NFS上 的元數據文件複製到SNN上,將SNN作爲新的NN。
DataNode的作用:
- 存儲block數據。
- 向NN發送心跳,報告自身狀態。
- 向NN發送block報告。
- 與客戶端交互,傳遞block數據或寫block。
客戶端讀HDFS文件流程概況:
- 客戶端連接NN,告訴NN需要讀哪個文件。
- NN驗證客戶端身份。
- 返回文件一個block的ID,以及該block所在的所有DN的列表,並將這些DN按與客戶端的距離進行排序。
- 客戶端選擇最合適的DN讀取block數據。
- 重複進行上面操作過程,直到所有block數據讀取完畢,或者是客戶端中斷讀取流。
- 客戶端連NN,告知需要寫文件。
- NN驗證客戶端身份及權限。
- NN創建文件元數據。
- NN響應客戶端,告訴客戶端可以開始寫文件。
- 客戶端將待上傳的文件劃分多個packet(按block大小劃分),並將這些packet放在內存隊列中。
- 客戶端另起線程從內存隊列中獲取一個packet,向NN要待寫入block的DN列表。
- NN根據複製因子數選擇一組DN給客戶端。
- 客戶端選擇列表中第一個DN連接。
- 第一個DN接收客戶端連接,連接列表中第二個DN,第二個DN連接第三個DN,依次類推,直到最後一個DN。
- 客戶端將packet傳遞個第一個DN。
- 第一個DN將packet寫進本地磁盤,然後將其傳遞給第二個DN,依次下去直到最後一個DN。
- 最後一個DN寫操作完成,返回給上一個DN寫成功響應,依次向上反饋,直到第一個DN反饋給客戶端寫成功。
- 客戶端重複進行6-12過程,直到隊列中所有packet都寫完成。當所有的packet的反饋消息都是成功的,則客戶端斷開流,並告知NN寫文件完成。
三、SecondNameNode
NN將HDFS文件系統的元數據保存在本地文件系統的磁盤上,這些元數據在不同的文件上,其中最爲重要的是fsimage和edits文件。文件系統的名字空間,包括塊到文件的映射、及文件系統的屬性等,均被記錄在fsimage文件裏。對於文件的操作,比如創建文件,修改本分因子等操作均會被記錄在edits文件裏。
NN會在內存中保存一份整個HDFS文件系統的名字空間及塊的映射。
當NN啓動,或checkpoint觸發時,NN就會從本地磁盤讀取fsimage及edits文件,將edits記錄的所有事物作用於內存中的fsimage鏡像,並生成新版本的fsimage文件保存在本地磁盤。然後NN會截斷edits文件。這個過程就是checkpoint。觸發checkpoint過程,可以通過配置dfs.namenode.checkpoint.period參數,單位是秒,表示checkpoint週期間隔時間。還可以通過配置dfs.namenode.checkpoint.txns參數,表示當文件系統的事務堆積到一定數量後就觸發checkpoint。
通常由於checkpoint過程消耗主機資源,爲了減輕NN的壓力,SNN(Secondary NameNode)就出現了。SNN作用就是代替NN執行checkpoint過程。通常SNN與NN在不同的主機上,內存配置與NN相同。SNN與NN之間的交互過程:
- SNN通知NN滾動edits文件,生成edits.new文件。
- SNN從NN拷貝fsimage及edits文件到本地checkpoint目錄。
- SNN加載fsimage到內存,並將edits作用於內存的fsimage,生成新的fsimage。
- SNN將新的fsimage文件壓縮到磁盤。
- SNN將新的fsimage文件傳遞給NN,NN採用最新的fsimage。
- NN將edits.new更名爲edits。
由上面過程可以看出,SNN在進行checkpoint過程時,NN會將這段期間的文件變更操作寫進edits.new文件裏,在SNN返回新的fsimage文件後,NN將其更名爲edits。這樣的話SNN的checkpoint總是會比NN要少一部分文件的變更,因此當NN損毀後,使用SNN恢復的文件系統將會缺少部分數據,這是不可避免的。
四、Checkpoint Node
由於SNN的名字容易讓人產生誤會,故而HDS又提供了CN(checkpoint node)。CN的作用是替代SNN進行NN的checkpoint過程。它所需要的配置與SNN一樣,同樣啓動在與NN不同的主機上。它的啓動命令是hdfs namenode -checkpoint。CN可以啓動多個。
五、Backup Node
BN同樣有checkpoint能力。但同時它的內存中維持着與NN保持同步的文件系統的名字空間,是NN名字空間的一個備份。由於它始終與NN保持同步,因此它在checkpoint過程中不需要再特別從NN上下載fsimage及edits文件。由於BN在checkpoint時只需要將自己內存的名字空間狀態寫進本地磁盤並重置edits文件,因此BN將會比SNN及CN更加高效。
BN的內存要求與NN一致。目前一個NN只能支持一個BN,且使用BN後就不能使用CN。以後可能會同時支持多個BN。
BN的啓動命令hdfs namenode -backup。
BN也提供了自己的web配置參數dfs.namenode.backup.address及dfs.namenode.backup.http-address。
使用BN可以讓NN不需要持久存儲,需要在NN配置參數dfs.namenode.edits.dir,在NN啓動時使用-importCheckpoint命令就可以。
當NN損壞時,BN就可以當做新的NN使用。
六、Import checkpoint
SNN與CN都會將最後的checkpoint存儲在指定的目錄裏,其目錄結構與NN目錄結構相同。配置參數dfs.namenode.checkpoint.dir。當NN啓動時指定-importCheckpoint參數,則會從dfs.namenode.checkpoint.dir目錄裏將文件拷貝到dfs.namenode.name.dir文件目錄裏。如果dfs.namenode.name.dir裏已存在合法的fsimage文件,則導入操作就會報失敗。