HDFS 用戶手冊

HDFS Users Guide

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 集群:

本文如下部分假設用戶有能力在至少在一個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.hostsdfs.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.addressdfs.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的文檔。如下列表是進一步探索的起點:

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。