目的
該文件是使用者使用Hadpoop分散式檔案系統(HDFS)的起點,不管是作為hadoop叢集的一部分來使用還是獨立的通用分散式檔案系統。雖然在很多場景下HDFS被設計成“正常工作”即可,但是掌握更多的HDFS工作機制將有利於更好的配置以及診斷。
概述
HDFS是使用Hadoop程式來實現的分散式儲存系統。一個HDFS叢集主要包含管理檔案系統名稱空間的Namenode以及儲存實際資料的Datanode。HDFS架構指南已經詳細介紹了HDFS。本使用者指南主要負責使用者、管理員與HDFS叢集之間互動的介紹。HDFS架構圖描述了Namenode、Datanode以及客戶端之間的基本互動。客戶端聯絡NameNode以獲取檔案後設資料或檔案修改,並直接使用DataNodes執行實際檔案I/O。
下面可能是許多使用者感興趣的一些顯著特性。
- Hadoop,包括HDFS,適合使用一些商用主機進行分散式儲存以及分散式計算。它容錯率高並且很容易擴充套件。MapReduce因其簡單性和適用於大量分散式應用程式而聞名,是Hadoop不可或缺的一部分。
- HDFS是高度可配置的,同時提供了預設配置。大多數時候,只有在面對非常大的叢集時才需要進行一些配置。
- Hadoop使用JAVA編寫並支援在所有主流平臺上執行。
- Hadoop支援類似shell一樣的命令列與HDFS互動。
- Namenode和Datanode內建web服務,便於檢查當前叢集狀態。
- 在HDFS中定期實現新的特性和改進。下面即為部分有用的特性:
- 檔案許可權以及認證
- 機架感知:在計劃任務和分配儲存時考慮節點的物理位置
- 安全模式:一種維護管理模式
- fsck:檔案系統健康狀態診斷,發現丟失的檔案或塊
- fetchdt:獲得Delegation token的工具,並且儲存到本地檔案系統的檔案中
- Balancer:平衡叢集的工具,當資料在Datanode中不均勻分佈的時候
- 升級以及回滾:當軟體升級後,HDFS可能需要回滾到升級前的狀態以預防一些位置問題
- Secondary NameNode:定期檢查名稱空間,並保持HDFS修改日誌的檔案大小在Namenode限定範圍內。
- 檢查點節點:定期檢查名稱空間,並最小化Namenode上HDFS修改日誌的檔案大小。充當以前由Secondary NameNode擔任的角色,雖然它還沒有被增強。只要沒有向系統註冊備份節點,NameNode就可以同時允許多個Checkpoint節點。
- 備份節點:檢查點節點的擴充套件。除了檢查功能外,它還以資料流的形式接收來自Namanode的所有操作。備份節點在自身記憶體中儲存名稱空間的備份,並且這個備份跟活躍Namenode的名稱空間保持同步。Namenode只允許一個備份節點註冊進來。
先決條件
下面的文件介紹如何安裝和啟動一個Hadoop叢集:
接下來的文件假設使用者有能力搭建並執行至少有一個Datanode的HDFS。完成本文件的學習,使用者可以將Namenode和Datanode放在同一臺物理機上。
Web 介面
Namenode和Datanode內部都執行了web服務,用來展示叢集當前狀態的基本資訊。預設配置下,Namenode的前端頁面請訪問http://namenode-name:50070/。 該頁面展示Datanode列表以及叢集的基本統計資訊。這個web介面同樣可以用來瀏覽檔案系統(點選頁面中的“Browse the file system”)。
Shell 命令
Hadoop包含豐富的類 shell 命令,用來跟HDFS和其他Hadoop支援的檔案系統進行直接互動。執行“bin/hdfs dfs -help”命令將列出Hadoop支援的命令。此外,執行“bin/hdfs dfs -help command-name” 展示“command-name”命令的詳細資訊。這些命令支援大部分普通的檔案系統操作,例如拷貝檔案,修改檔案許可權等等。它還支援一些HDFS的特定操作,例如改變檔案複製。詳細資訊請檢視 File System Shell Guide
DFSAdmin 命令
“bin/hdfs dfsadmin” 命令支援一些跟HDFS管理員相關的操作。“bin/hdfs dfsadmin -help” 命令會列出當前支援的所有命令。例如:
- -report: HDFS基礎統計資訊報告。報告中的一些資訊同樣可以在Namenode網頁上看到。
- -safemode: 雖然通常不需要,但管理員可以手動地方式進入或離開安全模式。
- -finalizeUpgrade: 刪除上次叢集升級過程中所做的備份。
- -refreshNodes:
- -printTopology :
更多資訊,請檢視 dfsadmin
Secondary NameNode
Namenode以日誌的形式儲存更新資訊,該日誌資訊追加到本地檔案edits中。當Namenode啟動,它從一個稱為“FsImage”的image檔案中讀取HDFS狀態,然後使用編輯日誌檔案中的修改資訊。隨後,寫入新的HDFS狀態到FsImage檔案中並使用一個新的空的的edits檔案開始常規操作。因為Namenode只在啟動的時候才合併Fsimage和edits檔案,在一個工作頻繁的叢集上edits日誌檔案會變得非常龐大,這會導致Namenode下次重啟時會花費很長時間。
Secondary NameNode定期合併Fsimage和edits檔案,並保持edits檔案大小在一個限定範圍內。Secondary NameNode通常執行在與主Namenode不同的機器上,因為Secondary NameNode需要相同大的記憶體來保證其執行。
啟動執行在Secondary NameNode的檢查點,主要被被兩個配置引數控制:
- dfs.namenode.checkpoint.period,預設被設定為1小時,指定兩個檢查點之間的最大間隔時間
- dfs.namenode.checkpoint.txns,預設設定為一百萬,定義Namenode上未檢查的事務數量,當達到該數量時進行強制檢查,即使是檢查間隔時間未到。
Secondary NameNode將最新的檢查點儲存在與主Namenode專案的檔案路徑下。所以,當需要時NameNode可以隨時讀取Secondary NameNode上的檢查點image檔案。
詳細資訊,請檢視Secondary NameNode
檢查點節點
Namenode通過兩種檔案來維持名稱空間:fsimage以及journal (log)。其中,fsimage是名稱空間的最大檢查點以及編輯檔案,journal則記錄自上一個檢查點之後的更新操作。當NameNode啟動時,它會合並fsimage和edits journal以提供檔案系統後設資料的最新檢視。NameNode然後用新的HDFS狀態覆蓋fsimage並開始一個新的編輯日誌。
檢查點節點定期建立名稱空間的檢查點。它從活躍的Namenode上下載fsimage和edits,然後在本地進行合併,最後上傳最新的fsimage到活躍的Namenode上。檢查點節點通常執行在與主Namenode不同的機器上,因為檢查點節點需要相同大的記憶體來保證其執行。使用者可以在配置檔案指定的節點上執行“bin/hdfs namenode -checkpoint”來啟動檢查點節點。
“dfs.namenode.backup.address”和“dfs.namenode.backup.http-address”配置屬性可以指定檢查點節點的位置以及其web介面地址。
兩個配置引數影響檢查點的執行:
- dfs.namenode.checkpoint.period,預設被設定為1小時,指定兩個檢查點之間的最大間隔時間
- dfs.namenode.checkpoint.txns,預設設定為一百萬,定義Namenode上未檢查的事務數量,當達到該數量時進行強制檢查,即使是檢查間隔時間未到。
檢查點節點將最新的檢查點儲存在與主Namenode專案的檔案路徑下。所以,當需要時NameNode可以隨時讀取檢查點節點上的檢查點image檔案。
叢集配置檔案中可以同時指定多個檢查點。
詳細資訊,請檢視 namenode
備份節點
備份節點跟檢查點節點一樣提供相同的檢查功能,將相關資訊儲存在記憶體中,更新名稱空間的拷貝並與活躍Namenode狀態保持同步。除了接受來自NameNode的檔案系統編輯的日誌流並將其持久儲存到磁碟之外,備份節點還將這些編輯應用到其自己的記憶體中名稱空間的副本中,從而建立名稱空間的備份。
備份節點不需要像Secondary NameNode和Checkpoint node一樣從活動NameNode下載fsimage和編輯檔案,以便建立檢查點,因為它已經儲存名稱空間的最新狀態在記憶體中。備份節點程式更高效,因為它只需要將名稱空間儲存到本地fsimage檔案中並重置編輯。
因為備份節點需要將名稱空間儲存在記憶體中,所以它需要跟Namenode一樣的記憶體大小。
Namenode一次只支援一個備份節點。當備份節點在使用時,我們就無需檢查點節點。同時支援多個備份節點將在未來實現。
備份節點的配置方式與檢查點節點相同。我們可以使用“bin/hdfs namenode -backup”來啟動備份節點。
“dfs.namenode.backup.address”和“dfs.namenode.backup.http-address”配置屬性可以指定備份節點的位置以及其web介面地址。
備份節點提供了使NameNode執行時不需要進行持久化的選項,將保留名稱空間狀態的所有責任委派給備份節點。要執行此操作,請使用-importCheckpoint選項來啟動NameNode,併為edits型別設定非永續性儲存目錄 dfs.namenode.edits.dir。
關於備份節點和檢查點節點的產生原因的討論,檢視 HADOOP-4539
匯入檢查點
如果fsimage和edits檔案的備份丟失,我們可以將最新的檢查點匯入到Namenode中。操作如下:
- 在配置項“dfs.name.dir”指定的位置建立一個空資料夾
- 在配置項“dfs.namenode.checkpoint.dir”指定檢查點的目錄位置
- 使用“-importCheckpoint”引數啟動Namenode
NameNode會從fs.checkpoint.dir目錄讀取檢查點, 並把它儲存在“dfs.name.dir”目錄下。如果dfs.name.dir目錄下有合法的fsimage,NameNode會啟動失敗。NameNode會檢查“fs.checkpoint.dir”目錄下映象檔案的一致性,但是不會去改動它。
相信資訊,請檢視 namenode
平衡器
HDFS資料可能不會均勻地分佈在各個Datanode上。一個常見的原因是一個新的Datanode加入到已經存在的叢集中。當需要給新的塊選擇位置,Namenode在選擇哪些Datanode來存放前會考慮多個因素:
- 根據就近原則,將資料塊的一個副本放在正在寫這個資料塊的節點上
- 考慮將塊資料放到不同機架上,以降低單機架故障風險
- 一個副本通常被放置在和寫檔案的節點同一機架的某個節點上,從而降低跨機架的頻寬消耗
- 儘量均勻地將HDFS資料分佈在叢集的DataNode中
由於上述多種考慮需要取捨,資料可能並不會均勻分佈在DataNode中。HDFS為管理員提供了一個工具,用於分析資料塊分佈和重新平衡DataNode上的資料分佈。HADOOP-1652 的附件中的一個PDF是一個簡要的rebalancer管理員指南。
詳細資訊,請檢視 balancer