此文件是使用者使用 Hadoop 分散式檔案系統 (HDFS) 的起點,無論是作為 Hadoop 群集的一部分,還是作為獨立的通用分散式檔案系統。雖然 HDFS 設計為在許多環境中「正常運作」,但對 HDFS 的工作知識有助於特定群集的組態改進和診斷。
HDFS 是 Hadoop 應用程式使用的主要分散式儲存。HDFS 集群主要包含一個管理檔案系統元資料的 NameNode 和儲存實際資料的 DataNode。HDFS 架構指南詳細描述 HDFS。本使用者指南主要處理使用者和管理員與 HDFS 集群的互動。HDFS 架構圖描繪 NameNode、DataNode 和用戶端之間的基本互動。用戶端會連絡 NameNode 以取得檔案元資料或進行檔案修改,並直接與 DataNode 執行實際的檔案 I/O。
下列是一些可能對許多使用者感興趣的顯著功能。
Hadoop(包括 HDFS)非常適合使用一般硬體進行分散式儲存和分散式處理。它具有容錯性、可擴充性,而且極易於擴充。MapReduce 以其簡潔性和適用於大量分散式應用程式的特性而聞名,是 Hadoop 的一個組成部分。
HDFS 可高度設定,其預設設定非常適合許多安裝。大多數時候,只需要針對非常大型的集群調整設定。
Hadoop 以 Java 編寫,並支援所有主要平台。
Hadoop 支援類 shell 指令,可直接與 HDFS 互動。
NameNode 和 Datanode 內建網路伺服器,可輕鬆查看集群的目前狀態。
HDFS 會定期實作新功能和改進。以下是 HDFS 中一些有用的功能子集
檔案權限和驗證。
機架感知:在排程工作和配置儲存時考量節點的實體位置。
安全模式:用於維護的管理模式。
fsck
:診斷檔案系統健康狀況的工具,可找出遺失的檔案或區塊。
fetchdt
:取得委派權杖並將其儲存在本機系統上的檔案中的工具。
平衡器:當資料在 DataNode 中分佈不均時,用於平衡集群的工具。
升級和回滾:在軟體升級後,如果發生意外問題,可以回滾到升級前的 HDFS 狀態。
次要 NameNode:定期執行名稱空間的檢查點,並協助將包含 HDFS 修改記錄的檔案大小維持在 NameNode 的特定限制內。
檢查點節點:定期執行名稱空間的檢查點,並協助將儲存在 NameNode 中包含 HDFS 變更的記錄大小降至最低。取代次要 NameNode 先前扮演的角色,但尚未歷經戰場考驗。只要系統中沒有註冊的備份節點,NameNode 就允許多個檢查點節點同時存在。
備份節點:檢查點節點的延伸。除了檢查點外,它也會從 NameNode 接收編輯串流,並維護自己的名稱空間記憶體中副本,該副本會持續與 NameNode 的名稱空間狀態同步。NameNode 一次只能註冊一個備份節點。
下列文件說明如何安裝和設定 Hadoop 群集
本文件的其餘部分假設使用者能夠設定並執行具有至少一個資料節點的 HDFS。就本文件而言,名稱節點和資料節點都可以執行在同一部實體機器上。
名稱節點和資料節點各執行一個內部網路伺服器,以顯示群集目前狀態的基本資訊。在預設組態中,名稱節點首頁位於 http://namenode-name:9870/
。它會列出群集中的資料節點和群集的基本統計資料。網路介面也可使用於瀏覽檔案系統(使用名稱節點首頁上的「瀏覽檔案系統」連結)。
Hadoop 包含各種 shell 類似指令,可直接與 HDFS 和 Hadoop 支援的其他檔案系統進行互動。bin/hdfs dfs -help
指令會列出 Hadoop shell 支援的指令。此外,bin/hdfs dfs -help command-name
指令會顯示指令的更詳細說明。這些指令支援大部分的正常檔案系統作業,例如複製檔案、變更檔案權限等。它也支援一些 HDFS 特定的作業,例如變更檔案的複寫。如需更多資訊,請參閱 檔案系統 Shell 指南。
bin/hdfs dfsadmin
指令支援一些與 HDFS 管理相關的作業。bin/hdfs dfsadmin -help
指令會列出目前支援的所有指令。例如:
-report
:報告 HDFS 的基本統計資料。名稱節點首頁上也提供一些此類資訊。
-safemode
:雖然通常不需要,但管理員可以手動進入或離開安全模式。
-finalizeUpgrade
:移除上次升級期間製作的群集先前備份。
-refreshNodes
:使用允許連線至名稱節點的資料節點集合更新名稱節點。預設情況下,名稱節點會重新讀取 dfs.hosts
、dfs.hosts.exclude
檔案中定義的資料節點主機名稱。dfs.hosts
中定義的主機是群集中的資料節點。如果 dfs.hosts
中有項目,則只有其中的主機才能向名稱節點註冊。dfs.hosts.exclude
中的項目是需要停用的資料節點。或者,如果 dfs.namenode.hosts.provider.classname
設定為 org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
,則所有包含和排除的主機都會在 dfs.hosts
定義的 JSON 檔案中指定。當所有複寫都已複寫到其他資料節點時,資料節點會完成停用。停用的節點不會自動關閉,也不會選用來寫入新的複寫。
-printTopology
:列印群集的拓撲。顯示名稱節點所見的機架樹狀結構和附加到機架的資料節點。
關於指令用法,請參閱 dfsadmin。
NameNode 將檔案系統的修改儲存為附加至原生檔案系統檔案 edits 的記錄檔。當 NameNode 啟動時,它會從映像檔 fsimage 讀取 HDFS 狀態,然後套用 edits 記錄檔的編輯。接著,它會將新的 HDFS 狀態寫入 fsimage,並以空的 edits 檔案開始正常運作。由於 NameNode 只會在啟動時合併 fsimage 和編輯檔案,因此在繁忙的叢集上,edits 記錄檔可能會隨著時間推移而變得非常大。較大的編輯檔案的另一個副作用是,下一次重新啟動 NameNode 會花費更長的時間。
次要 NameNode 會定期合併 fsimage 和 edits 記錄檔,並將編輯記錄檔大小維持在限制範圍內。它通常會在與主要 NameNode 不同的機器上執行,因為它的記憶體需求與主要 NameNode 相同。
次要 NameNode 上檢查點程序的開始由兩個組態參數控制。
dfs.namenode.checkpoint.period
,預設設定為 1 小時,指定兩個連續檢查點之間的最大延遲,以及
dfs.namenode.checkpoint.txns
,預設設定為 100 萬,定義 NameNode 上未檢查點的交易數,即使尚未達到檢查點期間,也會強制執行緊急檢查點。
次要 NameNode 會將最新的檢查點儲存在一個目錄中,其結構與主要 NameNode 的目錄相同。因此,如果需要,檢查點映像隨時可以供主要 NameNode 讀取。
有關命令用法,請參閱 secondarynamenode。
NameNode 使用兩個檔案來儲存其名稱空間:fsimage(名稱空間的最新檢查點)和編輯,即自檢查點以來名稱空間變更的日誌 (記錄)。當 NameNode 啟動時,它會合併 fsimage 和編輯日誌,以提供檔案系統元資料的最新檢視。然後,NameNode 會以新的 HDFS 狀態覆寫 fsimage,並開始新的編輯日誌。
檢查點節點會定期建立名稱空間的檢查點。它會從活動的 NameNode 下載 fsimage 和編輯,在本地合併它們,並將新映像上傳回活動的 NameNode。檢查點節點通常會在與 NameNode 不同的機器上執行,因為它的記憶體需求與 NameNode 相同。檢查點節點是由 bin/hdfs namenode -checkpoint 在組態檔案中指定的節點上啟動的。
檢查點 (或備份) 節點及其隨附的網路介面的位置是透過 dfs.namenode.backup.address
和 dfs.namenode.backup.http-address
組態變數進行組態的。
檢查點節點上檢查點程序的開始由兩個組態參數控制。
dfs.namenode.checkpoint.period
,預設設定為 1 小時,指定兩個連續檢查點之間的最大延遲
dfs.namenode.checkpoint.txns
,預設設定為 100 萬,定義 NameNode 上未檢查點的交易數,即使尚未達到檢查點期間,也會強制執行緊急檢查點。
檢查點節點將最新檢查點儲存在目錄中,其結構與 NameNode 的目錄相同。如此一來,必要時 NameNode 就能隨時讀取檢查點映像。請參閱匯入檢查點。
可以在叢集設定檔中指定多個檢查點節點。
如需指令使用方式,請參閱 namenode。
備份節點提供與檢查點節點相同的檢查點功能,並維護檔案系統名稱空間的即時內存副本,該副本會持續與 active NameNode 狀態同步。除了接受 NameNode 的檔案系統編輯日誌串流並將其保留到磁碟外,備份節點還會將這些編輯套用到其在內存中的名稱空間副本,進而建立名稱空間的備份。
備份節點不需要從 active NameNode 下載 fsimage 和編輯檔案來建立檢查點,就像檢查點節點或次要 NameNode 所需的一樣,因為它已經在內存中擁有最新的名稱空間狀態。備份節點檢查點程序更有效率,因為它只需要將名稱空間儲存到本機 fsimage 檔案並重設編輯。
由於備份節點在內存中維護名稱空間的副本,因此其 RAM 需求與 NameNode 相同。
NameNode 一次只支援一個備份節點。如果備份節點正在使用中,則無法註冊任何檢查點節點。未來將支援同時使用多個備份節點。
備份節點的設定方式與檢查點節點相同。它會使用 bin/hdfs namenode -backup
啟動。
備份(或檢查點)節點的位置及其隨附的網路介面會透過 dfs.namenode.backup.address
和 dfs.namenode.backup.http-address
設定變數來設定。
使用備份節點可選擇在沒有永久儲存空間的情況下執行 NameNode,將保留名稱空間狀態的所有責任委派給備份節點。為此,請使用 -importCheckpoint
選項啟動 NameNode,並同時為 NameNode 設定不指定任何編輯類型 dfs.namenode.edits.dir
的永久儲存空間目錄。
如需有關建立備份節點和檢查點節點的動機的完整討論,請參閱 HADOOP-4539。如需指令使用方式,請參閱 namenode。
如果影像和編輯檔案的所有其他副本都遺失,則可以將最新檢查點匯入 NameNode。為此,您應該
建立 dfs.namenode.name.dir
組態變數中指定的空目錄;
在組態變數 dfs.namenode.checkpoint.dir
中指定檢查點目錄的位置;
並使用 -importCheckpoint
選項啟動 NameNode。
NameNode 會從 dfs.namenode.checkpoint.dir
目錄上傳檢查點,然後將其儲存到 dfs.namenode.name.dir
中設定的 NameNode 目錄。如果 dfs.namenode.name.dir
中包含合法的影像,則 NameNode 會失敗。NameNode 會驗證 dfs.namenode.checkpoint.dir
中的影像是否一致,但不會以任何方式修改它。
如需指令使用方式,請參閱 namenode。
HDFS 資料可能並不總是均勻地放置在 DataNode 中。一個常見的原因是將新的 DataNode 新增到現有叢集。在放置新的區塊(檔案的資料儲存為一系列區塊)時,NameNode 會在選擇要接收這些區塊的 DataNode 之前考慮各種參數。一些考量因素包括
將區塊的其中一個複本保留在與寫入區塊的節點相同的節點上的政策。
需要將區塊的不同複本分散在機架上,以便叢集能夠在整個機架遺失的情況下存活。
其中一個複本通常會放置在與寫入檔案的節點相同的機架上,以便減少跨機架網路 I/O。
在叢集中的 DataNode 中均勻分散 HDFS 資料。
由於多種相互競爭的考量因素,資料可能無法均勻地放置在 DataNode 中。HDFS 為管理員提供了一個工具,用於分析區塊放置並在 DataNode 中重新平衡資料。管理員的平衡器簡要指南可在 HADOOP-1652 取得。
平衡器支援兩種模式:作為工具或作為長期執行服務執行
在工具模式下,它會盡最大努力平衡叢集,並在以下條件下退出
所有叢集都已平衡。
過多迭代次數,沒有任何位元組被移動(預設為 5)。
無法移動任何區塊。
叢集升級中。
其他錯誤。
在服務模式中,平衡器將以長時間執行的守護程式服務執行。其運作方式如下
對於每個回合,它會嘗試平衡叢集,直到成功或在發生錯誤時傳回。
您可以設定每個回合之間的間隔,間隔由 dfs.balancer.service.interval
設定。
當遇到意外例外時,它會嘗試多次,然後再停止服務,這是由 dfs.balancer.service.retries.on.exception
設定。
有關指令使用,請參閱 平衡器。
HDFS 叢集可以辨識每個節點放置的機架拓撲。設定此拓撲非常重要,才能最佳化資料容量和使用率。有關更多詳細資料,請查看共用文件中的 機架感知。
啟動期間,NameNode 會從 fsimage 和編輯記錄檔載入檔案系統狀態。然後,它會等待 DataNode 回報其區塊,以便它不會過早開始複製區塊,儘管叢集中已存在足夠的複本。在此期間,NameNode 會保持在安全模式。NameNode 的安全模式基本上是 HDFS 叢集的唯讀模式,其中不允許對檔案系統或區塊進行任何修改。通常,在 DataNode 回報大多數檔案系統區塊可用後,NameNode 會自動離開安全模式。如果需要,可以使用 bin/hdfs dfsadmin -safemode
指令將 HDFS 明確置於安全模式。NameNode 首頁會顯示安全模式是否開啟或關閉。更詳細的說明和設定會保留為 setSafeMode()
的 JavaDoc。
HDFS 支援 fsck 指令來檢查各種不一致之處。它設計用於報告各種檔案的問題,例如檔案的區塊遺失或複製區塊不足。與原生檔案系統的傳統 fsck 程式不同,此指令不會修正它偵測到的錯誤。通常,NameNode 會自動修正大部分可復原的失敗。預設情況下,fsck 會忽略開啟的檔案,但提供一個選項可在報告期間選取所有檔案。HDFS fsck 指令不是 Hadoop shell 指令。它可以作為 bin/hdfs fsck
執行。有關指令使用方式,請參閱 fsck。fsck 可以執行於整個檔案系統或檔案的子集。
HDFS 支援 fetchdt 指令來擷取委派權杖並將其儲存在本機系統上的檔案中。此權杖稍後可從非安全客戶端存取安全伺服器(例如 NameNode)。此公用程式使用 RPC 或 HTTPS(透過 Kerberos)來取得權杖,因此需要在執行前提供 Kerberos 認證(執行 kinit 以取得認證)。HDFS fetchdt 指令不是 Hadoop shell 指令。它可以作為 bin/hdfs fetchdt DTfile
執行。取得權杖後,您可以執行 HDFS 指令,而不需要 Kerberos 認證,方法是將 HADOOP_TOKEN_FILE_LOCATION
環境變數指向委派權杖檔案。有關指令使用方式,請參閱 fetchdt 指令。
通常,您會設定多個儲存位置。然後,如果一個儲存位置損毀,您可以從其他儲存位置之一讀取資料。
但是,如果唯一可用的儲存位置損毀,您能怎麼辦?在這種情況下,有一個稱為復原模式的特殊 NameNode 啟動模式,可能允許您復原大部分資料。
您可以像這樣以復原模式啟動 NameNode:namenode -recover
在復原模式下,NameNode 會在命令列中互動式提示您有關復原資料的可能做法。
如果您不想收到提示,您可以提供 -force
選項。此選項會強制復原模式始終選取第一個選項。通常,這將是最合理的選項。
由於復原模式可能會導致您遺失資料,因此在使用之前,您應該始終備份您的編輯記錄檔和 fsimage。
當 Hadoop 在現有叢集中升級時,與任何軟體升級一樣,可能會出現影響現有應用程式且未在早期發現的新錯誤或不相容變更。在任何非平凡的 HDFS 安裝中,遺失任何資料都是不可行的,更不用說從頭重新啟動 HDFS。HDFS 允許管理員返回 Hadoop 的較早版本,並將叢集回滾到升級前的狀態。HDFS 升級在 Hadoop 升級 Wiki 頁面中有更詳細的說明。HDFS 一次只能有一個這樣的備份。在升級之前,管理員需要使用 bin/hadoop dfsadmin -finalizeUpgrade
指令移除現有的備份。以下簡要說明典型的升級程序
在升級 Hadoop 軟體之前,請確定是否有現有的備份。
停止叢集並分發新版本的 Hadoop。
使用 -upgrade
選項執行新版本(sbin/start-dfs.sh -upgrade
)。
大多數時候,叢集都能正常運作。一旦新的 HDFS 被認為運作良好(可能在操作幾天後),請完成升級。請注意,在叢集完成之前,刪除升級前存在的檔案不會釋放 DataNodes 上的實際磁碟空間。
如果需要返回舊版本,
停止叢集並分發 Hadoop 的較早版本。
在名稱節點上執行回滾指令(bin/hdfs namenode -rollback
)。
使用回滾選項啟動叢集。(sbin/start-dfs.sh -rollback
)。
升級到 HDFS 的新版本時,有必要重新命名或刪除 HDFS 新版本中保留的任何路徑。如果名稱節點在升級期間遇到保留路徑,它將列印類似以下的錯誤
/.reserved 是保留路徑,而 .snapshot 是此 HDFS 版本中的保留路徑組成部分。請回滾並刪除或重新命名此路徑,或使用 -renameReserved [金鑰值對] 選項升級,以便在升級期間自動重新命名這些路徑。
指定 -upgrade -renameReserved [選用金鑰值對]
會導致名稱節點在啟動期間自動重新命名任何找到的保留路徑。例如,要將所有名為 .snapshot
的路徑重新命名為 .my-snapshot
,並將 .reserved
重新命名為 .my-reserved
,使用者會指定 -upgrade -renameReserved .snapshot=.my-snapshot,.reserved=.my-reserved
。
如果未指定任何金鑰值對與 -renameReserved
,名稱節點將使用 .<LAYOUT-VERSION>.UPGRADE_RENAMED
為保留路徑加上字尾,例如 .snapshot.-51.UPGRADE_RENAMED
。
此重新命名程序有一些注意事項。建議在升級前先 hdfs dfsadmin -saveNamespace
(如果可能)。這是因為如果編輯記錄操作參照自動重新命名檔案的目的地,可能會導致資料不一致。
資料節點支援熱插拔硬碟。使用者可以在不關閉資料節點的情況下新增或更換 HDFS 資料磁碟區。以下簡述熱插拔硬碟的典型程序
如果有新的儲存目錄,使用者應格式化並適當地掛載它們。
使用者更新資料節點組態 dfs.datanode.data.dir
,以反映將主動使用的資料磁碟區目錄。
使用者執行 dfsadmin -reconfig datanode HOST:PORT start
以啟動重新組態程序。使用者可以使用 dfsadmin -reconfig datanode HOST:PORT status
查詢重新組態任務的執行狀態。除了 HOST:PORT 之外,我們也可以指定資料節點的 livenodes。這將允許在所有活動資料節點上啟動或查詢重新組態,而指定 HOST:PORT 則只允許在 HOST:PORT 所代表的特定資料節點上啟動或查詢重新組態。livenodes 查詢範例為 dfsadmin -reconfig datanode livenodes start
和 dfsadmin -reconfig datanode livenodes status
。
重新組態任務完成後,使用者可以安全地 umount
已移除的資料磁碟區目錄,並實體移除磁碟。
檔案權限的設計類似於其他常見平台(例如 Linux)上的檔案權限。目前,安全性僅限於簡單的檔案權限。啟動 NameNode 的使用者被視為 HDFS 的超級使用者。HDFS 的未來版本將支援網路驗證協定(例如 Kerberos),以進行使用者驗證和資料傳輸加密。詳細資訊會在權限指南中討論。
Hadoop 目前在擁有數千個節點的叢集上執行。PoweredBy Wiki 頁面列出一些在大型叢集上部署 Hadoop 的組織。HDFS 為每個叢集有一個 NameNode。目前,NameNode 上可用的總記憶體是主要的擴充性限制。在非常大型的叢集上,增加儲存在 HDFS 中的檔案平均大小有助於增加叢集大小,而不會增加 NameNode 的記憶體需求。預設組態可能不適合非常大型的叢集。FAQ Wiki 頁面列出建議的組態改進,以適用於大型 Hadoop 叢集。
此使用者指南是開始使用 HDFS 的良好起點。雖然使用者指南持續改進,但有關 Hadoop 和 HDFS 的文件非常豐富。下列清單是進一步探索的起點