本文翻譯自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html 基於2.8.0文檔 1.目的 本文可以作為以下人員的入門指引:使用hdfs的用戶,或者僅僅使用分散式文件系統的用 ...
本文翻譯自:http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html
基於2.8.0文檔
1.目的
本文可以作為以下人員的入門指引:使用hdfs的用戶,或者僅僅使用分散式文件系統的用戶。雖然hdfs設計的目的是在多個環境中可以用,但關於Hdfs的工作原理還是很有助於配置和診斷特定集群。
2.概述
HDFS是Hadoop應用的主要分散式存儲。一個hDFS集群主要包含一個名稱節點(管理文件系統元數據)和一個多個數據節點(存儲實際的數據)。HDFS框架指引詳細地描述了HDFS。本指引主要描述有關用戶交互和HDFS集群管理。HDFS框架圖簡要示意了名稱節點,數據節點和客戶端的交互。
客戶端連接名稱節點獲得文件系統元數據或者文件修改,然後和數據節點進行直接的文件i/o。
以下一些顯著的特性對可能然許多用戶感興趣:
- hadoop,包含hdfs,很適用於分散式存儲,並利用普通的設備進行分散式計算。它有容錯,可伸縮,極其容易擴展。mapreduce,以簡單和可用於大量分散式應用知名,是hadoop的一部分。
- HDFS是高度可配,並有一個預設的配置,可以有許多的安裝方式。絕大部分時候,只有在非常大的集群中才需要調優(譯註:應該是指節點多,數據多吧?)。
- hadoop使用java編寫,支持所有主要的平臺
- hadoop支持類似於shell的命令,可以用於交互hdfs目錄
- 名稱節點和數據節點都有內建的web伺服器,用戶很容易檢查集群當前狀態
- HDFS中一些新特性和提升會定期實現,以下幾點是一些有用的特性:(譯註,這是基於2.8.0編寫的)
- 文件許可權和授權
- 機棧敏感:在調度任務和分配存儲的時候,會考慮一個節點的物理位置。
- 安全模式(safemode):用於維護的可管理模式(譯註:可以通過命令設置為這種狀態)
- fsck:用於診斷文件系統的健康,查找丟失的文件或者塊。
- fetchdt:用戶獲取委托令牌(?delegationToken),並把令牌存儲到本地文件系統
- 均衡器(balancer):均衡集群的工具
- 升級和回滾:在軟體升級之後,有可能回滾到升級之前的狀態(如果有不可測的問題)
- 第二名稱節點:執行定期的名稱空間檢查點,並幫助名稱節點中包含hdfs修改的日誌文件保持在特定大小
- 檢查點節點:執行名稱空間定期的檢查點,並幫助名稱節點中包含HDFS變更日誌的文件保持在最小狀態。可以替代第二名稱節點,雖然這不是強制的。只要系統中沒有備份節點,那麼名稱節點允許存在多個檢查點節點。
- 備份節點:是檢查點節點的擴展(升級)。除了可以做檢查點,它也從名稱節點接受編輯日誌流,併在自己的記憶體中維護名稱空間,這個空間是和名稱節點的名稱空間同步的。只能有一個備份節點。
3.前提
以下文檔描述如何安裝配置一個hadoop集群:
http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/SingleCluster.html
http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/ClusterSetup.html
本文的剩餘部分都會假設用戶可以配置並運行至少有一個數據節點的HDFS。如果名稱節點和數據節點運行在單一機器也是可以的。
4.web界面
名稱節點和數據節點都有運行內部的web伺服器,它們可以顯示關於當前集群狀態的基本信息。
根據預設設置,名稱節點的主頁是http://namenode-name:50070/.它會列出集群中的名稱節點和集群的基本統計信息。web界面也可以用於瀏覽文件系統
譯註:
可以通過8042,8099,50070埠訪問,如果不修改預設配置的話。
例如http://bigdata.lzf:8099可以看集群配置文件
http://bigdata.lzf:50070 可以看數據節點和文件
5.shell命令
hadoop包含各種類shell命令,可以用來交互HDFS和hadoop支持的其它文件系統。
命令 bin/hdfs dfs -help列出hadoop shell支持的命令。此外,bin/hdfs -help 命令名稱 可以顯示更多的細節。
這些命令支持類似普通文件系統絕大部分的操作,例如複製文件,修改許可權,等等。hdfs也會支持一些hdfs特定的操作,諸如修改文件複製。
譯註:這個部分的內容和2.8.0全部文檔中關於文件操作的不盡相同。hdfs dfs的命令雖然和hadoop fs 基本一致,但2.8.0的文檔基本只介紹hadoop fs。這可能是文檔沒有妥當更新的緣故。
6.DFSAdmin 命令
hdfs dfsadmin命令支持一些hDFS管理。使用hdfs dfsadmin -help可以看看dfsadmin的詳細幫助。
譯註:更多細節參閱hadoop文檔,或者看幫助,本文的目的不在於這些細節。
7.第二名稱節點
名稱節點使用本地文件系統來記錄文件系統的修改,這個文件稱為編輯日誌。當名稱節點啟動的時候,會從映像文件(fsimage-本地文件)獲取狀態,然後把編輯日誌總的事務應用到映像文件中,然後生成新的映像文件,而現有的編輯日誌被清空。
由於每次節點只在啟動的時候整合日誌文件和映像文件,隨著時間的推移,日誌文件就可能變得非常巨大。巨大文件的一個影響是,下一次名稱節點啟動的時候,會耗費更多時間。
第二名稱節點的作用之一就是定期合併編輯日誌和映像文件,以便日誌文件的大小保持在一個限度下。第二名稱節點通常運行在單獨的機器上,因為它對記憶體的需求同主名稱節點一樣。
第二名稱節點上檢查點進程的啟動受到兩個可配參數的控制:
dfs.namenode.checkpoint.period:預設是1小時(單位是秒),設定了兩個連續檢查點之間的最大延遲
dfs.namenode.checkpoint.txns:預設是1百萬(譯註:單位是個),設定未檢查的事務數,操作這個數,就會觸發檢查點操作。
譯註:兩個條件之一滿足就會觸發檢查點操作
第二名稱節點把最新的檢查點存儲在本地目錄,這個目錄結構同主名稱節點。這樣,如果有必要,主名稱節點總是可以讀取檢查點映像。(譯註:這就是後面說的導入檢查點)
8.檢查點節點
譯註:由於這個東西和第二名稱節點的作用類似,所以原文的絕大部分可以省略。
hdfs namenode -checkpoint --啟動檢查點節點
dfs.namenode.backup.address 和dfs.namenode.backup.http-address可以用於配置檢查點(或者備份)節點的地址,包括http地址。
如果沒有備份節點,那麼可以設定多個檢查點節點。
9.備份節點
備份節點提供除了和檢查點節點一樣,可以提供檢查點功能,還能夠實時同步一個和主節點一樣的系統命名空間(在記憶體中,並且狀態是活動)。備份節點從主節點通過流的方式接受主節點上的編輯日誌,並把這些日誌保存在磁碟中,同時這些編輯日誌一樣會被應用到記憶體中,這樣備份節點記憶體中的名稱空間就和主節點完全一樣。
備份節點不需要從主節點下載映像文件和編輯日誌,因為它的記憶體中有個和主節點一樣的名稱空間。備份節點的檢查點進程更加高效,因為它只需要把名稱空間保存到本地的映像文件,並充值編輯日誌。
由於備份幾點維持了一個記憶體中的名稱空間備份,所以它對於記憶體的需求同名稱節點。
名稱節點只支持一個備份節點。備份節點和檢查點節點是不共存的。將來會支持同時使用多個備份節點(毫無疑問這是非常有必要的,apache已經意識到了)。
備份節點的配置方式同檢查點節點--- hdfs namenode -backup.
備份節點的位置它的web界面通過dfs.namenode.backup.address 和dfs.namenode.backup.http-address來配置。
通過使用備份節點,就可以在在非持久設備上運行名稱節點,並把狀態的持久責任全部委托給備份節點。為了達到這個目的,可以在啟動名稱節點的時候帶上-importCheckpoint參數,同時dfs.namenode.edits.dir參數中可以設定一個非持久存儲目錄。
為了能夠全面討論創建備份節點和檢查點節點背後的動機,請參閱 https://issues.apache.org/jira/browse/HADOOP-4539
中關於名稱節點部分內容。
10.導入檢查點
如果編輯日誌和映像文件的所有其它備份都無效(或者丟失),那麼可以把最新的檢查點導入到名稱節點中。為了這麼做,應當:
- 根據參數dfs.namenode.name.dir的設置,創建一個空間的目錄
- 確定dfs.namenode.checkpoint.dir設定的檢查點路徑
- 啟動名稱節點,大必須帶上-importCheckpoint選項。
名稱節點從檢查點路徑下載元數據到本地的dfs.namenode.name.dir,名稱節點會檢查映像文件的一致性,但不做任何修改。
The NameNode will upload the checkpoint from the dfs.namenode.checkpoint.dir directory and then save it to the NameNode directory(s) set in dfs.namenode.name.dir. The NameNode will fail if a legal image is contained in dfs.namenode.name.dir. The NameNode verifies that the image in dfs.namenode.checkpoint.dir is consistent, but does not modify it in any way.
11.均衡器
HDFS的數據可能並不總是均勻分佈在各個數據節點上。一個通常的原因是新節點的加入。
當存放新數據塊的時候,名稱節點考慮多個情況以便選擇一個可以接受數據的數據節點,這些情況包括:
- 在寫入數據塊的節點上保留一個複製(譯註:理所當然)
- 把部分複製放在不同機棧,避免整個機棧失效的時候,數據不會丟失
- 至少有兩個複製在同一個機棧,這樣可以減少網路I/O
- 在集群數據節點之間均勻分佈HDFS數據
由於這些存在一定互斥的考慮,數據就可能無法在節點見均勻分佈。HDFS給管理員提供了一個工具,可以分析塊的分佈,併在各個數據節點之間重新均衡數據塊。
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-source [-f <hosts-file> | <comma-separated list of hosts>]]
[-blockpools <comma-separated list of blockpool ids>]
[-idleiterations <idleiterations>]
詳細參考
http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Balancer
12.機棧敏感
一個HDFS集群可以識別機棧拓撲(機棧--節點存放的地方)。為了優化數據的存儲和使用,正確配置拓撲還是很重要的。
具體參考:http://www.cnblogs.com/lzfhope/p/7000456.html
13.安全模式
名稱節點啟動的時候,首先至於安全模式,目的是檢查複製情況,檢查期間名稱節點可讀不可修改,這意味著期間任意文件都不可修改。
調整為正常模式之後,會把一些沒有正常複製的數據塊重新補充複製下。
除了啟動的時候,自動設置為安全模式,也可以顯式(手工)把集群設置為安全模式-- hdfs dfsadmin -safemode
14.fsck-文件檢查
fsck專門檢查各種文件的問題。例如塊丟失,或者塊複製不足。
不同於傳統文件系統的檢查工具,這個命令並不修正發現的錯誤。通常名稱節點自動修改絕大部分可以恢復的問題。
預設情況下,fsck會忽略打開的文件,但我們可以在執行這個命令的時候通過選項控制是否忽略打開的文件。
HDFS fsck命令並不是hadoop shell命令。
15.fetchdt-獲取委托令牌
HDFS支持fetchdet命令,以便獲取委托令牌,並把令牌存儲在本地文件系統。
令牌可以讓用戶從一個不安全的客戶端訪問安全的(secure)伺服器(例如名稱節點)。
通過rpc或者https(通過kerberos)獲取令牌的工具,它們需要提供kerberos票。HDFS的fetchdt命令並非hadoop shell命令(譯註:同fsck一樣,雖然說不是hadoop shell命令,但我們一般都是那麼任務的,只不過命令是以hdfs 開頭).
當通過工具獲得令牌之後,就可以不需要kerberos票就可以運行hdfs命令,前提是設置HADOOP_TOKEN_FILE_LOCATION環境變數。HADOOP_TOKEN_FILE_LOCATION指向令牌的存儲位置。
16.恢復模式
典型地,我們會配置多個元數據存儲位置。然後,如果一個存儲點壞了,那麼我們可以從其它存儲點讀取。
然而,如果只有一個存儲點,且壞了,我們能怎麼辦? 在這種情況下,有一個特別的名稱節點啟動模式,稱為恢復模式,這個模式可能讓我們恢復大部分的數據。
命令: hdfs namenode -recover
當處於恢復模式的時候,名稱節點以交互方式提示我們輸入一些信息,做出一些選擇。
如果不想被提示,可以給出-force選項。這種情況下,如果有選擇,程式也只會選擇第一個項目。通常情況下,這可能是最合理的選擇。
因為恢復模式可能導致數據丟失,所以應該在執行前備份編輯日誌和映像文件。
17.升級和回滾
當升級一個集群的時候,可能會出現一個新的bug或者一些不相容現有軟體的情況。在任何的正式安裝中,肯定是選擇保護數據,所以必須重啟hdfs。
hdfs允許管理員回退到更早的hadoop版本和升級前的狀態。hdfs升級的內容在hadoop升級wiki頁面有更詳細的說明。
HDFS一個時間只能有一個備份。在升級之前,管理員需要移除現存的備份,命令是hdfs dfsadmin -finalizeUpgrade.
下麵簡要描述典型的升級過程:
- 如果有備份節點,那麼先移除
- 停止集群,並部署新版本的hadoop
- 運行sbin/start-dfs.sh -upgrade
- 大部分時間,集群運行良好。一旦認為新的HDFS運行良好(可能升級幾天之後),結束升級。註意,除非集群認定升級完畢,否則刪除升級前的文件不會真正釋放數據節點上的空間
- 如果要回滾到老版本
-
- 停止集群,並部署早版本的hadoop
- 在名稱節點上執行hdfs namenode -rollback
- 以回滾方式啟動集群 sbin/start-dfs.sh -rollback
當升級到一個新版本hdfs的時候,有必要刪除在新版hdfs中保留的的路徑(也可以重新命名).如果名稱節點在升級過程遇到一個保留的路徑,那麼它會輸入類似如下的錯誤信息:
/.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來繞過以上問題。例如,如果想重新命名所有.snapshot的路徑為.my-snapshot,用戶可以如下操作:
-upgrade -renameReserved .snapshot=.my-snapshot
如果有多個目錄,可以如下:
-upgrade -renameReserved .snapshot=.my-snapshot,.reserved=.my-reserved
對於重命名過程,有一些警告。我們建議,如果可能,應該在升級前保存名稱空間(通過 hdfs dfsadmin -saveNamespace).
這是因為數據可能不一致,如果編輯日誌操作執行一個自動改名的文件。
18.數據節點熱交換磁碟
數據節點支持熱交換磁碟。用戶可以添加或者更換磁碟,而不用關閉數據節點。
下麵簡要描述熱交換磁碟過程:
- 如果有新的存儲目錄,那麼用戶應該格式化和掛載
- 修改dfs.datanode.data.dir設置,加入新的路徑
- 執行dfsadmin -reconfig datanode host:port start,以啟動重配置路徑。然後,使用dfsadmin -reconfig datanode host:port status查詢重配置任務的狀態
- 一旦重新配置完成,用戶就可以安全的卸載有關目錄,並物理移除磁碟
譯註:這個小節告訴我們,配置一個單機的時候,存儲數據的磁碟應該和操作系統磁碟有可能的話,還是分開。即一臺電腦上最好有兩塊硬碟,而且最好支持熱拔插。
19.文件許可權和安全
文件系統的許可權類似linux的。目前,安全僅限於簡單的文件許可權。啟動名稱節點的用戶被當作HDFS的超級用戶。
將來版本的HDFS會支持網路應用協議,例如用戶的kerberos授權和數據傳輸加密。詳細的信息參與許可權指引。
譯註:用戶的kerberos授權,好像很早版本就有了,是否原文整理的時候沒有糾正?
20.可伸縮
hadoop當前可以構建一個成千上萬節點的集群。這個頁面powerdBy列出了知名的用戶。
hdfs有一個名稱節點。目前數據節點上的可用記憶體是主要的伸縮限制。在非常大的集群上,提高平均文件大小會提升集群的大小。預設的配置可能不適用於非常大集群。FAQ WIKI提供了大型集群的建議配置。
譯註:hadoop也在不斷升級中。
訪問 https://wiki.apache.org/hadoop/FAQ ,可以獲得許多可能有益的幫助。
作為hadoop的核心,瞭解hdfs是唯一重要的事情。mr在很多小型的集群或者hadoop應用中,作用並不是很大。在將來的硬體情況下,mr更加沒有價值。