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