HDFS用戶指南(翻譯)
HDFS用戶指南原文地址:https://hadoop.apache.org/core/docs/current/hdfs_user_guide.html
譯者:dennis zhuang(killme2008@gmail.com),有錯誤請指正,多謝。
目的
本文檔可以作為使用Hadoop分布式文件係統用戶的起點,無論是將HDFS應用在一個Hadoop集群中還是作為一個單獨的分布式文件係統使用。HDFS被設計成可以馬上在許多環境中工作起來,那麼一些HDFS的運行知識肯定能大大地幫助你對一個集群做配置改進和診斷。
概覽
HDFS是Hadoop應用的主要分布式存儲。一個HDFS集群由一個管理文件係統元數據的NameNode,和存儲實際 數據的一些Datanode組成。HDFS的架構在這裏有詳細描述。這個用戶指南主要提供給需要跟HDFS集群打交道的用戶或者管理員。HDFS架構文章 中的圖描繪了Namenode、Datanode和客戶端們之間的基本交互。本質上,客戶端與Namenode通訊獲取或者修改文件的元數據,與 Datanode進行實際的IO操作。
下麵的列表應該是大多數用戶關心的HDFS突出特點。斜體字的術語將在後麵詳細描述。
1)Hadoop,包括HDFS,非常適合廉價機器上的分布式存儲和分布式處理。它是容錯的、可伸縮的,並且非常易於擴展。並且,以簡單性和適用性著稱的Map-Reduce是Hadoop不可或缺的組成部分。
2)HDFS的默認配置適合於大多數安裝的應用。通常情況下,隻有在一個非常大規模的集群上才需要修改默認配置。
3)HDFS是用java編寫的,支持大多數平台。
4)支持shell命令行風格的HDFS目錄交互。
5)Namenode和Datanode都內建了web服務器,可以方便地查看集群的狀態
6)HDFS經常性地實現新的特性和改進,下麵是HDFS中的一些有用特性的子集:
文件許可和授權
Rack awareness:當調度任務和分配存儲的時候將節點的物理位置考慮進去。
Safemode(安全模式):用於維護的一個管理狀態
fsck: 診斷文件係統的一個工具,用來查找丟失的文件或者block
Rebalancer:當數據在Datanode間沒有均勻分布的時候,用於重新平衡集群的工具
升級和回滾:當Hadoop軟件升級,在升級遇到不可預期的問題的時候,可以回滾到HDFS升級前的狀態
二級Namenode:幫助Namenode維持包含了HDFS修改的日誌的文件(edits日誌文件,下文談到)大小在限製範圍內。
前提條件
下麵的文檔描述了一個Hadoop集群的安裝和設置:
-
Hadoop Quickstart,給初次使用用戶
-
Hadoop Cluster Setup 大規模、分布式集群
本文檔的剩餘部分假設你已經搭設並運行了一個至少擁有一個Datanode的HDFS。基於本文檔的目的,Namenode和Datanode可以運行在同一台機器上。
Web接口
Namenode和Datanode分別跑了一個內置的web服務器,來展現集群當前狀態的一些基本信息。在默認配置 下,Namenode的首頁地址是https://namenode:50070(namenode就是Namenode節點所在機器IP或者名稱)。這個 頁麵列出了集群中的所有datanode以及集群的基本統計。web接口同樣可以用於瀏覽文件係統(點擊Namenode首頁上的“Browse the file system"鏈接)。
Shell命令
Hadoop包括了多種shell風格的命令,用於跟HDFS或者Hadoop支持的其他文件係統交互。命令 bin/hadoop fs -help 可以列出Hadoop shell支持的命令。更進一步,bin/hadoop fs -help command 可以展現特定命令command的幫助細節。這些命令支持一般文件係統的操作,例如拷貝文件、修改文件權限等。同時也支持了部分HDFS特有的命令,例如 修改文件的replication因子。
DFSAdmin命令
'bin/hadoop dfsadmin' 命令支持一些HDFS管理功能的操作。'bin/hadoop dfsadmin -help'可以列出所有當前支持的命令。例如:
- -report : 報告HDFS的基本統計信息。部分信息同時展現在Namenode的web首頁上。
- -safemode : 盡管通常並不需要,管理員還是可以通過手工操作進入或者離開safemode狀態
- -finalizeUpgrade : 移除上一次升級時集群所做的備份。
二級Namenode
Namenode將對文件係統的修改存儲在一個原生文件係統文件中(名為edits的文件)。當Namenode啟動的時 候,它從映像文件(fsimage)讀取HDFS的狀態,然後將edits日誌文件中的修改作用在此內存狀態上,接著將得到的新的HDFS狀態寫回 fsimage,後續的正常操作開始於一個空的edits日誌文件。由於Namenode僅僅在啟動的時候將fsimage和edits合並,因此在一個 大的集群上經過一定時間操作後,edits文件將會非常大。由此帶來的一個副作用就是下次Namenode的重新啟動將花費很長時間。二級 Namenode就是為了解決這個問題,它會周期性地合並fsimage和edits日誌文件,並且將edits日誌文件的大小保持在限製範圍內。通常它 會跑在另一個機器上,因為它的內存要求跟主namenode一樣。二級Namenode可以通過'bin/start-dfs.sh'啟動在conf /masters配置文件裏配置的節點上。
Rebalancer
HDFS的數據可能不會總是在Datanode之間分布得很一致。一個常見的原因是往現有的集群中加入了新的Datanode。當分配block的時候,Namenode依據幾個參數來決定哪個datanode來接受這些block。一些需要考慮的因素如下:
1)一個block的副本存放在正在寫該block的節點上
2)需要將一個block的副本擴展到其他機架上,防止因為整個機架故障導致的數據丟失。
3)副本之一通常放在同一個機架的另一個節點上,減少跨機架的網絡IO
4)將HDFS數據均勻一致地分布在集群中的datanode上。
基於這些相互競爭的因素,數據可能不會在Datanode之間擴展得一致。HDFS給管理員提供了一個工具,用來分析block的分配情況和在datanode之間重新平衡數據。這個功能暫未實現,它的描述可以在這個 PDF文檔中看到,記錄編號HADOOP-1652.
Rack Awareness
典型的大規模Hadoop集群是部署在數個機架上的,那麼顯然同一個機架內的節點間的網絡通訊比之不同機架間節點間的網 絡通訊更可取。另外,Namenode會嚐試將block的副本分布在數個機架中以提高容錯性。Hadoop讓集群管理員來決定某個節點從屬於哪個機架, 通過配置變量dfs.network.script來實現。當這個腳本有配置的時候,每個節點都運行該腳本來決定它的rackid。默認安裝假設所有的節 點從屬於同一個機架。這個特性和配置進一步的闡述在這個PDF文檔,編號為 HADOOP-692。
Safemod(安全模式)
當Namenode啟動的時候,它從fsimage和edits日誌兩個文件中加載文件係統的狀態。然後等待 datanode報告他們的block信息,以便防止Namenode在確認block副本是否足夠前過早地開始複製block。這段時間的 Namenode就是處於所謂safemode狀態。處於safemode的Namenode也是HDFS集群的隻讀模型,此時不允許任何對文件係統或者 block的修改。正常情況下,Namenode會在開始後自動退出safemode。如果有需要,HDFS可以通過'bin/hadoop dfsadmin -safemode'命令顯式地進入safemode狀態。Namenode的web首頁顯示當前的safemode是否打開。更詳細的描述和配置可以參 考setSafeMode()方法的JavaDoc。
譯 注:詳細介紹下safemode的配置參數,在safemode狀態,Namenode會等待所有的datanode報告他們自己的block信息,看看 所有的block的副本是否達到最低要求的數目,這個數目可以通過dfs.replication.min參數配置,默認是1,也就是至少要求有一個副 本。當報告合格的Datanode的數目達到一定百分比,Namenode才會離開safemode狀態。這個百分比也是可配置的,通過 dfs.safemode.threshold.pct參數,默認是0.999f(也就是要求99.9%的Datanode 合格)。Namenode在合格的datanode數目達到要求的時候,並不是馬上離開safemode狀態,會有一個擴展時間,讓剩餘的 datanode來報告block信息,這個擴展時間默認是30秒,可以通過dfs.safemode.extension參數配置,單位是毫秒。
Fsck
HDFS提供了fsck命令用來檢測各種各樣的不一致性。fsck被設計用來報告各種文件的問題,例如某個文件丟失的 block,block的副本數目是否低於設置等。不同於傳統的一般原生文件係統的fsck命令,hdfs的fsck命令並不修正所檢測到的錯誤。通常情 況下,Namenode會自動修正大多數可以被修複的錯誤,HDFS的fsck不是Hadoop shel的命令,可以通過'bin/hadoop fsck'執行,可以運行在整個文件係統上或者一個文件子集上。
升級和回滾
當升級某個集群的Hadoop的時候,正如任何軟件的升級一樣,可能會引入新的bug或者不兼容的修改導致現有的應用出 現過去沒有發現的問題。在所有重要的HDFS安裝應用中,是不允許出現因丟失任何數據需要從零開始重啟HDFS的情況。HDFS允許管理員恢複到 Hadoop的早期版本,並且將集群的狀態回滾到升級前。HDFS的升級細節請參考 upgrade wiki。HDFS在任何時間隻能有一個備份,因此在升級前,管理員需要通過'bin/hadoop dfsadmin -finalizeUpgrade'命令移除現有的備份。下麵簡要描述了典型的升級過程:
1)在升級Hadoop前,如果已經存在備份,需要先結束(finalize)它。可以通過'dfsadmin -upgradeProgress status'命令查詢集群是否需要執行finalize
2)停止集群,分發部署新版本的Hadoop
3)執行新版本的hadoop,通過添加 -upgrade 選項,例如/bin/start-dfs.sh -upgrade
4)大多數情況下,集群在升級後可以正常運行。一旦新的HDFS在運行若幹天的操作後沒有出現問題,那麼就可以結束(finalize)這次升級。請注意,在升級前刪除的文件並不釋放在datanode上的實際磁盤空間,直到集群被結束(finalize)升級前。
5)如果有需要回到老版本的Hadoop,那麼可以:
a)停止集群,分發部署老版本的Hadoop
b)通過rollback選項啟動集群,例如bin/start-dfs.sh -rollback
文件許可和安全
文件許可的設計與其他平台(如linux) 的文件係統類似。在當前實現,安全被限製在簡單的文件許可上。啟動Namenode的用戶被作為HDFS的超級用戶。HDFS的未來版本將支持網絡驗證, 例如Kerberos方案(譯注:MIT開發的一個驗證係統)的用戶驗證以及數據傳輸的加密。更詳細的討論參考Permissions User and Administrator Guide。
伸縮性
Hadoop正運行在成千上萬個節點的集群上。 PoweredBy Hadoop列 出了一些部署Hadoop在大規模集群上的組織和機構。HDFS在每個集群上隻有一個Namenode節點,Namenode節點上可用內存是當前伸縮性 的主要限製。在非常大規模的集群上,增加HDFS中存儲的文件的平均大小,將可以幫助提高集群的大小而不用增加Namenode的內存需求。默認的配置可 能不適合非常大規模的集群應用。Hadoop FAQ頁列出了對於大規模Hadoop集群的配置改進建議。
關聯文檔
本用戶指南可作為使用HDFS很好的一個起點,在本文檔持續改進的同時,有一些非常有價值的關於Hadoop和HDFS的文檔資料可供參考。下列資料可作為進一步探索的起點:
- Hadoop Home Page : Hadoop一切的起始頁。
- Hadoop Wiki :由社區維護的wiki文檔。
- FAQ from Hadoop Wiki.
- Hadoop JavaDoc API.
- Hadoop User Mailing List : core-user[at]hadoop.apache.org.
- 瀏覽conf/hadoop-default.xml文件,它包括了當前可用配置變量的概括介紹。
- 文章轉自莊周夢蝶 ,原文發布時間2008-08-14
最後更新:2017-05-17 18:31:31