Purpose
本文檔是用戶使用HDFS的啟蒙文檔,不管是作為Hadoop集群的一部分,還是獨立運行的通用分布式文件系統。雖然HDFS設計的目的是在很多環境工作就好,了解HDFS知識有助于進行配置升級和診斷。
Overview
HDFS是Hadoop應用的主要分布式存儲。HDFS集群包含NameNode和DataNodes,NameNode管理文件系統元數據, DataNodes存儲實際的數據。HDFS Architecture Guide 詳細的闡述了HDFS。本用戶手冊主要介紹用戶和管理員與HDFS集群的交互。HDFS architecture diagram 描述了NameNode,DataNodes,clients 的基本交互。Clients聯系NameNode獲取文件元數據or文件修改,實際的I/O直接聯系DataNodes。
如下是一些用戶感興趣的突出特征:
Hadoop,包括HDFS,是適合于在普通硬件運行的分布式存儲和分布式處理程序。它是容錯的、可擴展的,并且極易擴展。MapReduce是Hadoop不可獲取的一部分,以簡單和適用于大量分布式應用而聞名。
HDFS高度可配置,默認配置適用于大多數安裝。大多情況下,只需為超大的集群調整配置。
Hadoop以Java語言開發,被所有主流平臺支持。
Hadoop支持以類shell的命令行直接與HDFS交互。
NameNode 和 Datanodes 都內置了web servers,可以很方便的查看集群當前狀態。
-
HDFS定期實現新功能和改進。如下是HDFS有用的一些特性:
文件權限和身份驗證
機架感知
Rack awareness
:在任務調度和分配任務的時候考慮節點的物理位置安全模式
Safemode
:維護時的管理員模式fsck:分析文件系統健康狀態的功能,可以發現丟失的文件or數據塊
fetchdt:獲取DelegationToken并存儲在本地文件系統的文件上
Balancer:當數據在DataNodes見分配不均衡時,平衡集群的工具
Upgrade and rollback:在軟件升級后,因為一些難以預測的問題,可以回滾至HDFS升級之前的狀態
Secondary NameNode: 定期檢查namespace的checkpoints,并幫助NameNode保持特定限制的、包含HDFS修改日志的文件大小。
Checkpoint node: 定期檢查namespace的checkpoints,并幫助最小化NameNode存儲HDFS變更的日志文件的尺寸。替換先前Secondary NameNode填充的role,雖然還沒有經過嚴格的生產檢驗。只要沒有 Backup nodes 注冊到系統,NameNode 就可以允許同時存在多個Checkpoint nodes 。
Backup node:Checkpoint node的擴展。除了checkpointing ,它還接受來自NameNode的流并維護它自己的namespace在內存中的副本,該副本總是同步active NameNode命名空間的狀態。一次只能向NameNode注冊一個備份節點。
Prerequisites
如下文檔描述了如何安裝和設置一個 Hadoop 集群:
- Single Node Setup for first-time users.
- Cluster Setup for large, distributed clusters.
本文如下部分假設用戶有能力在至少在一個DataNode上設置并運行一個HDFS實例。為了本文,NameNode 和DataNode 運行在同一個物理機上。
Web Interface
NameNode 和 DataNode 都內置web server 來提供集群狀態的基礎信息展示。默認配置,NameNode web接口 http://namenode-name:9870/。它列出了集群的DataNodes和集群的基礎統計信息。 該web接口還可以用于瀏覽文件系統(點擊 “Browse the file system”)。
Shell Commands
Hadoop包含類shell的命令可以與HDFS以及Hadoop支持的其他文件系統直接交互。命令bin/hdfs dfs -help
列出了Hadoop shell 支持的命令。命令bin/hdfs dfs -help command-name
顯示某命令更詳細的信息。這些命令支持大多數正常的文件系統操作,如復制文件、更改文件權限等。它還支持一些特定于HDFS的操作,如更改文件的副本。更多信息參考File System Shell Guide。
- DFSAdmin Command
bin/hdfs dfsadmin
命令支持一些HDFS管理相關的操作。bin/hdfs dfsadmin -help
命令列出了所有當前支持的命令。比如:-report
:報告HDFS的基本統計數據。NameNode首頁上也提供了一些此類信息。-safemode
:不常用,管理員可以手動進入、離開安全模式。-finalizeUpgrade
:刪除上次升級時集群的備份。-refreshNodes
:更新namenode,使用被允許連接到namenode的datanodes集合。默認,Namenodes重新讀取文件內dfs.hosts
、dfs.hosts.exclude
定義的datanode主機名。定義在dfs.hosts
的主機是屬于集群的datanodes。如果dfs.hosts
內有條目,只有在其內的主機被允許注冊到namenode。dfs.hosts.exclude
內的條目是需要被停用的datanodes。或者,如果dfs.namenode.hosts.provider.classname
被設置為org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
,所有include和exclude的主機都在JSON文件內被dfs.hosts
定義。當所有副本被復制到其他 datanodes,datanode完成停用。停用的nodes不會自動關閉,也不會被寫入新副本數據。-printTopology
:打印集群拓撲。以樹狀顯示racks,和在NameNode上看到的、racks上的datanodes。
命令的用法參考 dfsadmin。
Secondary NameNode
NameNode將文件系統的變更已日志的方式存儲到原生文件系統文件edits上。當NameNode啟動時,它從image file fsimage
讀取HDFS狀態,然后從edits log文件附加edits。然后,它寫入新的HDFS狀態到fsimage,并以空edits文件正常啟動。既然NameNode僅在啟動時合并fsimage和edits文件,那么繁忙集群的edits log文件可能會逐漸變的很大。大edits文件的另外一個影響,就是下次NameNode啟動時需要更長時間。
Secondary NameNode定期合并fsimage和edits log文件,并保持edits log在限制尺寸內。它通常與主NameNode在不同服務器上運行,因為它的內存需求跟主NameNode一樣。
Secondary NameNode 上檢查點進程的啟動由兩個參數控制。
dfs.namenode.checkpoint.period
,默認設置為1 hour,指定連續兩個checkpoints之間的最大延遲dfs.namenode.checkpoint.txns
,默認設置為100萬,定義強制緊急checkpoint的uncheckpointed事務的數量,即便checkpoint周期尚未到達。
Secondary NameNode在目錄內存儲最后的checkpoint,目錄結構和主NameNode目錄相同。 所以,如果需要,已經checkpointed 的 image 總是可以被主NameNode讀取。
命令使用請參見 secondarynamenode。
Checkpoint Node
NameNode使用兩個文件持久化命名空間:命名空間最后一次checkpoint和edits的fsimage
,自checkpoint后的命名空間的journal(log)
。當NameNode啟動時,合并fsimage和edits journal來提供一個最新的文件系統元數據視圖。然后 NameNode 以新HDFS狀態覆蓋fsimage,并開始新的edits journal。
Checkpoint node定期創建命名空間的checkpoints。它從active NameNode下載fsimage和edits,在本地合并,然后回傳新image給active NameNode。Checkpoint 通常和NameNode運行于不同的服務器,因為它的內存需求和NameNode相同。Checkpoint node在配置文件指定的node上以bin/hdfs namenode -checkpoint
啟動。
Checkpoint (or Backup) node 的位置和相隨的 web interface 通過dfs.namenode.backup.address
和 dfs.namenode.backup.http-address
變量指定。
Checkpoint node上checkpoint進程的啟動由兩個配置參數控制:
-
dfs.namenode.checkpoint.period
,默認設置為1 hour,指定連續兩個checkpoints之間的最大延遲 -
dfs.namenode.checkpoint.txns
,默認設置為100萬,定義強制緊急checkpoint的uncheckpointed事務的數量,即便checkpoint周期尚未到達。
Checkpoint node在目錄內存儲最后的checkpoint,目錄結構和主NameNode目錄相同。這允許checkpointed image始終可被NameNode讀取。參見導入checkpoint。
多checkpoint nodes可以在集群配置文件指定。
命令使用,參見namenode。
Backup Node
Backup node提供與Checkpoint node一樣的checkpointing功能,還維護著一套及時同步active NameNode狀態的最近的文件系統命名空間的內存中的副本。除了接受來自NameNode的文件系統的日志流,并持久化到硬盤,Backup node還將這些edits應用到其在內存中的命名空間副本,從而創建命名空間的備份。
Backup node不像Checkpoint node 或 Secondary NameNode那樣需要從active NameNode下載fsimage 和 edits 文件,因為它已經在內存內保存了一份實時更新的命名空間狀態。Backup node的checkpoint進程效率更高,因為它只需要保存命名空間到本地fsimage文件,然后重置edits。
因為Backup node在內存維護著命名空間的副本,那么它的內存需求也就與NameNode相同了。
NameNode同時只支持一個Backup node。如果使用了Backup node,那么Checkpoint nodes就注冊不了了。未來會支持多Backup nodes同時使用。
Backup node 配置方式與 Checkpoint node 相同。以bin/hdfs namenode -backup
啟動。
Backup (or Checkpoint) node 的位置和相隨的 web interface 通過dfs.namenode.backup.address 和 dfs.namenode.backup.http-address 變量指定。
Backup node的使用提供了不依賴固化存儲運行NameNode的選項,授權所有的倉庫將命名空間的狀態持久化到Backup node。為此,需要以 -importCheckpoint
參數啟動NameNode,同時指定NameNode配置dfs.namenode.edits.dir
沒有持久化存儲目錄。
有關創建Backup node和Checkpoint node動機的討論,參見HADOOP-4539。
命令使用,參見 namenode。
Import Checkpoint
如果image的其他副本和edits文件全部丟失,最近的checkpoint可以被導入到NameNode。操作如下:
創建一個在
dfs.namenode.name.dir
變量中指定的空目錄在配置文件變量
dfs.namenode.checkpoint.dir
指定checkpoint 目錄的位置以
-importCheckpoint
參數啟動NameNode
NameNode將從dfs.namenode.checkpoint.dir
目錄上傳checkpoint,然后保存到dfs.namenode.name.dir
目錄。如果dfs.namenode.name.dir
目錄已經存在合法Image,則失敗。NameNode驗證dfs.namenode.checkpoint.dir
下image的一致性,但是不會以任何方式修改。
命令使用,參見 namenode.
Balancer
HDFS數據跨DataNode的遍布可能是不一致的。一個常見原因是向現有集群添加新DataNodes。當放置新數據塊時,(文件作為一系列塊存儲),NameNode在選擇哪些DataNodes接受這些數據塊前會考慮很多因素。比如:
將塊的副本之一放在寫入該塊的同一臺node上
需要將塊的副本放置與不同機架上,這樣即使整個機架故障也不影響集群
副本之一通常放置于寫文件的node的同一機架上,這樣可以減少跨機架的網絡I/O
將HDFS數據均勻的分布于集群的DataNodes上
基于多種因素,數據可能不會均衡的分布于DataNodes上。HDFS提供了一個工具給管理員用于分析塊的散步情況和重新在DataNode間平衡數據。Balancer的主要管理員手冊參見HADOOP-1652.
命令行使用,參見balancer.
Rack Awareness
HDFS集群可以識別nodes所在racks的拓撲結構。為了優化數據容量和使用率,配置拓撲是非常重要的。詳細信息請參見 rack awareness 。
Safemode
在啟動時,NameNode從fsimage和edits log文件加載文件系統狀態。然后,等待DataNodes報告它們的塊,這樣就不會過早的開始復制塊雖然集群內已經存在足夠的副本。在這期間,NameNode保持在Safemode。NameNode的Safemode基本上就是HDFS集群的只讀模式,不允許對文件系統和塊進行任何修改。通常,在DataNodes報告大多數文件系統的塊可用后,NameNode自動離開Safemode。如果需要,HDFS可以使用bin/hdfs dfsadmin -safemode
命令明確指定Safemode。NameNode web接口會顯示Safemode是on還是off。更多細節描述和配置維護在setSafeMode()
的JavaDoc內。
fsck
HDFS支持fsck命令來檢查各種不一致性。它被設計用戶報告各種文件的問題,比如,文件缺少塊或正在復制塊。與原生文件系統的傳統fsck功能不同,該命令不會修復檢測到的錯誤。通常,NameNode會自動糾正大多數可恢復的故障。默認fsck忽略打開的文件,但是提供了一個選項可以在報告期間選擇所有文件。HDFS fsck 命令不是Hadoop shell命令。可以通過bin/hdfs fsck
運行。
命令的使用,參見 fsck。fsck可以在整個文件系統或者文件子集上運行。
fetchdt
HDFS支持fetchdt
命令獲取Delegation Token,并存儲到本地文件系統的文件。這個token可以用于從非安全客戶端訪問安全服務器 (比如 NameNode)。功能使用RPC or HTTPS (over Kerberos)獲取token,因此在運行前需要存在kerberos tickets (運行 kinit 獲取 tickets)。 HDFS fetchdt 命令不是Hadoop shell命令。它可以通過 bin/hdfs fetchdt DTfile
命令運行。獲得token后,你可以無需Kerberos tickets運行HDFS command, 通過將HADOOP_TOKEN_FILE_LOCATION
環境變量指向授權token文件。
命令使用,參見fetchdt 。
Recovery Mode
通常,你會配置多個元數據存儲位置。然后,如果一個存儲位置損壞了,你可以從其他位置讀取元數據。
但是,如果唯一的可用存儲位置損壞了怎么辦?這種情況下,有一種特殊的NameNode啟動模式 Recovery mode ,可以允許你恢復大多數數據。
你可以啟動NameNode的recovery mode,如下:namenode -recover
當位于recovery mode,NameNode會在命令行交互的提示可以采用哪些措施恢復數據。
如果你不需要提示,可以使用 -force
選項。該選項將強制recovery mode選擇第一選項。通常,這是最合理的選項。
因為Recovery mode可能會導致丟失數據,你應該在使用前備份 edit log 和 fsimage 。
Upgrade and Rollback
當Hadoop在現有集群上升級時,和其他軟件升級一樣,可能會存在一些以前沒發現的bug或者不兼容的變更,影響已經存在的應用。在任何正式HDFS安裝中,都不可以丟失數據,更不用說從頭重啟HDFS。HDFS允許管理員返回到Hadoop的早期版本,并將集群回滾到升級之前的狀態。HDFS升級在Hadoop Upgrade Wiki 有更詳細的描述。HDFS一次可以有一個這樣的備份。升級前,管理員需要刪除已有備份,使用命令bin/hadoop dfsadmin -finalizeUpgrade
。下面描述主要升級過程:
升級Hadoop前,確認是否已經存在備份
停止集群,分發新版本
以
-upgrade
參數運行新版本 (sbin/start-dfs.sh -upgrade
)大多數時候,集群工作的很好。一旦新HDFS被認為運行良好 (可能在運行幾天后),完成升級。注意,在集群完成之前,刪除升級前存在的文件不會釋放DataNodes上的真實磁盤空間。
-
如果需要回滾到舊版本,
停止集群,分發舊版本Hadoop
在namenode運行rollback命令(
bin/hdfs namenode -rollback
)以rollback選項啟動集群(
sbin/start-dfs.sh -rollback
)
當升級到新版本HDFS,有必要重命名或刪除新版本HDFS的保留路徑。如果NameNode在升級中遇到保留路徑,會打印類似如下的報錯:
/.reserved is a reserved path and .snapshot is a reserved path component in this version of HDFS. Please rollback and delete or rename this path, or upgrade with the -renameReserved [key-value pairs] option to automatically rename these paths during upgrade.
指定-upgrade -renameReserved [optional key-value pairs]
參數會導致NameNode在啟動時自動的重命名保留路徑 。比如,重命名所有.snapshot
路徑為 .my-snapshot
and 重命名.reserved
路徑為 .my-reserved
,一個用戶將指定 -upgrade -renameReserved .snapshot=.my-snapshot,.reserved=.my-reserved
。
如果-renameReserved
沒有指定鍵-值對,NameNode會給保留路徑添加后綴 :<LAYOUT-VERSION>.UPGRADE_RENAMED
,比如:snapshot.-51.UPGRADE_RENAMED
。
重命名過程有些注意事項。如果可以,建議在升級前,首先hdfs dfsadmin -saveNamespace
。這是因為,如果編輯日志操作引用自動重命名的文件的目標,可能會導致數據不一致。
DataNode Hot Swap Drive
Datanode支持熱插拔。用戶可以添加、替換HDFS數據卷而不需要關閉DataNode。如下主要描述了典型的熱插拔過程:
如果有新存儲目錄,用戶應該格式化并合適的掛載它們
用戶升級DataNode配置
dfs.datanode.data.dir
來反映將被使用的數據卷目錄用戶運行
dfsadmin -reconfig datanode HOST:PORT start
來啟動重配置進程。用戶可以使用dfsadmin -reconfig datanode HOST:PORT status
來查詢重配置任務的運行狀態。一旦重新配置完成,用戶就可以安全的卸載數據卷目錄并物理的移除磁盤
File Permissions and Security
文件權限被設計成與其他熟悉的平臺(比如Linux)類似。目前,安全性僅限于簡單的文件權限。啟動NameNode的用戶被視為HDFS的superuser。HDFS的未來版本將支持網絡認證協議,比如Kerberos,來提供用戶認證和數據傳輸加密。更多的細節在 Permissions Guide 有所討論。
Scalability
Hadoop目前運行在有數千節點的集群上。 PoweredBy Wiki 頁面列出了在大型集群上部署Hadoop的組織。HDFS每個集群都有一個NameNode。目前NameNode上總可用內存是主要擴展限制。在非常大的集群上,增加HDFS上文件的大小可以提升集群大小而不用增加NameNode的內存需求。默認設置不適合大集群。FAQ Wiki 列出了大型集群的配置優化建議。
Related Documentation
本用戶手冊是使用HDFS的一個好的開始。用戶手冊還在持續改進,還是有大量關于Hadoop和HDFS的文檔。如下列表是進一步探索的起點:
- Hadoop Site: Apache Hadoop 主頁。
- Hadoop Wiki: Hadoop Wiki。 不同于版本文檔,作為Hadoop源碼樹的一部分,Hadoop Wiki 由Hadoop 社區定期編輯。
- FAQ: FAQ Wiki。
- Hadoop JavaDoc API.
- Hadoop 用戶郵件列表:user[at]hadoop.apache.org.
- Explore hdfs-default.xml。它包含了可用配置變量的主要描述。
- HDFS Commands Guide: HDFS 命令使用手冊。