hadoop分佈式系統

簡介

HDFS, the Hadoop Distributed File System, 是一個分佈式系統,它被設計用來存儲大數據量的信息(通常是TB或PB),並提供對數據進行高吞吐量訪問的性能。文件被存儲在多臺機器中,確保系統的抗失 效性能以及並行應用程序的高效。這篇文章主要介紹 HDFS的設計意圖、結構,並告訴讀者怎樣去使用它。

本文的目標:

  • 瞭解HDFS的設計意圖,以及基本的分佈式系統的一些概念。
  • 學習怎樣從命令行中設置和使用HDFS。
  • 學習怎樣在應用程序中使用HDFS。

分佈式系統基本原理

分佈式系統被設計成可以存儲和管理大數據量的信息的系統,併爲這些數據提供對外的訪問功能(通過網絡)。現在已經有許多的分佈式系統用各種不同的方法解決了這個問題。

NFS, the Network File System, 是目前最普遍的分佈式系統。它也是還在使用的最老的分佈式系統之一。它的設計是非常易懂的,但它也有許多的侷限性。NFS 爲存儲在一臺機器上的一個邏輯卷提供遠程訪問。一個NFS能夠讓它的本地文件系統的一部分對其他的客戶端可見。然後,客戶端 會把這個遠程系統 加進 它們自己的 Linux 文件系統,然後就像 遠程系統在本地硬盤上一樣 去使用它。

這個模型的一個主要的優點就是它的透明性。客戶端壓根兒不用知道它們是否在使用遠程系統。標準庫中的方法,例如 open(),close(),fread(),等等,會幫助我們使用在NFS上的文件。

但是作爲一個分佈式系統,它的功能並不是很強大。NFS 中的文件始終都只是存儲在一臺機器上。這就意味着,存儲的容量不可能超過那臺機器的容量,並且 NFS 也不提供可靠性上的保證(比如 數據備份)。最後,因爲 所有的數據都被存儲在一臺機器上,那所有的客戶端都得跑到這臺機器上來取數據。當很多客戶端同時跑過來的時候,服務器可能會超負荷。而且,客戶端在每次處 理數據之前,都必須跑到服務器上去取數據。

HDFS的設計能夠解決一些其他的分佈式系統,例如 NFS,所無能爲力的問題。尤其是在以下一些方面:

  • HDFS的設計 能夠存儲海量的數據(通常是TB或PB),這要求將數據分散的存儲在多臺機器上。並且它所支持的文件大小比NFS所支持的要大很多。
  • HDFS能夠可靠的存儲數據,也即是說集羣裏面的個別機器的故障將不會影響到數據的使用。
  • HDFS能夠提供對數據快速的、可擴展的訪問。它能夠通過簡單的往集羣裏面加一臺機器的做法來解決大量客戶端同時訪問的問題。
  • HDFS很好的跟Hadoop MapReduce編程模型結合,儘可能的讓數據的計算和讀取操作在同一臺機器上執行。

HDFS的可擴展性,高性能也決定了它對應用程序的不同於其他分佈式系統的苛刻要求。爲了達到設計者的目的,設計者做了一些額外的限制設計和折中方案。主要有:

  • 使用HDFS的應用程序讀取文件的方式被假定爲流式讀取。HDFS在流式讀取的性能上做了些優化,當然這也就意味着,在文件上進行隨機讀取的操作的時間將會比較長。
  • HDFS的數據被設計成只允許一次寫入和多次讀取操作。當寫入操作被關閉後,想要往文件裏面更新一些內容是不受支持。(最近的Hadoop0.19將會支持在文件尾部增加數據。
  • 由於存儲的文件過大,以及它流式讀取方式,系統沒有提供緩存的功能。
  • 假定,個別機器的永久性崩潰和間歇性故障總是會頻繁的發生。集羣應該能夠承受多臺機器的故障,就算它們一起發生。集羣的性能將會按照所損失的機器的數量的比例減少,整個系統不會一下慢下來,數據也不會丟失。數據備份能夠起到作用。

HDFS的設計是基於google的分佈式系統GFS的,這裏是google發表的相關論文

HDFS 是一個塊結構的文件系統;每個文件都被分割成固定大小的文件塊。這些塊根據數據存儲策略被分別存儲在一臺或者多臺機器上。集羣中的機器,我們 叫,DataNode。一個文件能夠被分割成幾個文件塊,這些文件塊並不一定會被存儲在同一臺機器上,哪個塊存在哪個機器上是隨機的。由此,想要訪問一個 文件,或許得要幾臺機器一起合作才行。但是卻因此而獲得了存儲大文件的能力,顯而易見,文件能夠要求比單個硬盤更大的空間來存儲它。

如果一個文件的使用,需要多臺機器的配合,那麼一臺機器的故障將會導致該文件的不可用。HDFS通過爲文件的每一個塊都做備份的方式來解決這個問題(通常,有3個備份)。


圖 2.1: DataNodes 存儲着文件的文件塊 ,備份的數量是2 。NameNode 結點負責將文件名映射到文件塊的ID上。

多數塊結構的文件系統使用4k或者8k 數量級別的塊大小。相比之下,HDFS的塊大小默認下是64MB—一個大很多的數量級別。這個設計減少了HDFS持有的文件塊的數量(文件塊的容量大 的時候,塊的數量就會相應的減少了)。這樣做更有利於流式讀取方式。顯而易見,HDFS 非常喜歡 特大的文件,並且更喜歡流式地讀取它們。不像NTFS 或EXT這樣的文件系統,它們通常保存很多的小文件,HDFS更希望存儲適中數量的特大文件,幾百M的、幾百G的。畢竟,一個100M的文件也纔不過兩個 文件塊而已。在我們平常的計算機中,文件通常是被隨機訪問的,應用程序可能會讀取一個文件的不同的幾個部分,這些部分通常不是連續的存儲在硬盤上的。相比 之下,HDFS期望程序一次讀完整個文件。這種做法剛好非常適合MapReduce編程的風格。也就是說,像平常使用一般分佈式系統那樣去使用HDFS, 不是一個明智的選擇。

HDFS將文件分成塊,並存儲在幾臺機器上,這些文件不可能被當成正常文件系統的一部分了。在一臺跑Hadoop的機器上使用ls命令,返回的結果是 linux系統的內容,而並不會包括任何存儲在HDFS系統裏面的文件。HDFS是一個建立在本地文件系統之上的應用。HDFS的文件(更確切的說,組成 文件的那些文件塊) 被存儲在 DataNode 結點的一個特定的目錄下,但這些文件塊只有id。所以,你根本就沒有辦法使用linux 文件系統的一些工具(ls,cp,mv等等)去操作這些文件。不用操心,HDFS 自帶了文件管理功能,操作起來跟(ls,cp,mv)等命令一樣地簡單。

數據的可靠性是相當重要的。HDFS的數據被設計成只允許一次寫入和多次讀取操作,當大量的客戶端同時需要對文件目錄進行修改的時候,同步工作就顯得異常 重要了。所以,對文件目錄的維護由單獨的一臺機器來完成,這臺機器我們稱之爲NameNode。NameNode將會存儲 文件系統的文件目錄和文件名稱。因爲,每個文件需要記錄的東西是很少的(例如,文件名、權限、文件塊的位置等),所以,所有的數據都可以被存儲在一臺機器 上,並提供快速的訪問功能。

假設,客戶端要訪問文件A。客戶端從NameNode中取得組成文件A的文件塊的位置列表。這個列表知道文件塊被存儲在哪臺機器上。然後客戶端 直接 從DataNode上讀取文件數據。NameNode是不參與文件的傳輸的,我們要保證NameNode的消耗儘可能的小。

當然,我們還有預防NameNode機器崩潰的情況。我們使用冗餘來保證文件系統的數據不會丟失,即使是在NameNode忽然崩潰的情況下。顯 然,NameNode的崩潰要比集羣裏面的任何一臺DataNode的崩潰要嚴重得多了。當一臺DataNode故障的時候,整個集羣還可以繼續運行,但 當NameNode故障的時候,集羣就無法運行了,這時候,我們得手動的採取措施修復故障。當然,NameNode的工作量是相當的小的,它發生故障的概 率要比其他機器發生故障的概率小得多了。

關於HDFS的設計與實現,下面的這篇文章闡述的更加詳細。document

配置HDFS

配置HDFS應該是一件不難的事情。首先,我們先配好HDFS的配置文件,再對NameNode進行format操作。

配置Cluster

這裏,我們假定,你已經下載了Hadoop的一個版本,並解壓完畢。

Hadoop安裝目錄下的conf是hadoop存放配置文件的目錄,裏面有一些XML文件需要配置。conf/hadoop-defaults.xml 文件包含了hadoop的任何參數的默認值。這個文件應該是隻讀的。你可以通過在conf/hadoop-site.xml中設置新值的方式來覆蓋默認的 配置。集羣上所有的機器的hadoop-site.xml文件應該是一致的。

配置文件本身是鍵值對的一個集合。

XML語言hadoop-site.xml

<property>
<name>
property-name</name>
<value>
property-value</value>
</property>

property 中有  <final>true</final> 這樣的一行的,則表示這個屬性是不能被用戶應用程序覆蓋的。

下面的一些屬性是必須要配置的,這樣HDFS才能跑起來:

key value example
fs.default.name protocol://servername:port hdfs://alpha.milkman.org:9000
dfs.data.dir pathname /home/username/hdfs/data
dfs.name.dir pathname /home/username/hdfs/name

這些屬性的有着如下的意思:

fs.default.name – 這是一個描述集羣中NameNode結點的URI(包括協議、主機名稱、端口號),集羣裏面的每一臺機器都需要知道NameNode的地址。 DataNode結點會先在NameNode上註冊,這樣它們的數據纔可以被使用。獨立的客戶端程序通過這個URI跟DataNode交互,以取得文件的 塊列表。

dfs.data.dir – 這是DataNode結點被指定要存儲數據的本地文件系統路徑。DataNode結點上的這個路徑沒有必要完全相同,因爲每臺機器的環境很可能是不一樣 的。但如果每臺機器上的這個路徑都是統一配置的話,會使工作變得簡單一些。默認的情況下,它的值是/temp, 這個路徑只能用於測試的目的,因爲,它很可能會丟失掉一些數據。所以,這個值最好還是被覆蓋。

dfs.name.dir – 這是NameNode結點存儲hadoop文件系統信息的本地系統路徑。這個值只對NameNode有效,DataNode並不需要使用到它。上面對於/temp類型的警告,同樣也適用於這裏。在實際應用中,它最好被覆蓋掉。

這裏再介紹一個配置參數,它叫dfs.replication 。它決定着 系統裏面的文件塊的數據備份個數。對於一個實際的應用,它 應該被設爲3(這個數字並沒有上限,但更多的備份可能並沒有作用,而且會佔用更多的空間)。少於三個的備份,可能會影響到數據的可靠性(系統故障時,也許會造成數據丟失)。

下面是一個模板文件。

XML語言:

<configuration>
<property>
<name>
fs.default.name</name>
<value>
hdfs://your.server.name.com:9000</value>
</property>
<property>
<name>
dfs.data.dir</name>
<value>
/home/username/hdfs/data</value>
</property>
<property>
<name>
dfs.name.dir</name>
<value>
/home/username/hdfs/name</value>
</property>
</configuration>

your.server.name.com 需要被配置成正確的主機名,端口號的指定是隨意的。

配置好conf/hadoop-site.xml文件以後,你可以將conf目錄拷貝到其他的機器上了。

master結點有必要知道集羣裏其他機器的的地址,這樣啓動腳本才能正常運行。conf/slaves這個文件列舉了所有的可用的主機名,一個主機名一 行。在一個集羣的環境中,這個文件不需要包含master的地址。但是單機的情況下,master也要有,因爲除了master以外,沒有其他的機器可以 作爲DataNode結點了。

然後,建立我們要使用的目錄:

user@EachMachine$ mkdir -p $HOME/hdfs/data

user@namenode$ mkdir -p $HOME/hdfs/name

執行Hadoop的用戶需要這些目錄的讀寫權限,使用chmod命令爲該用戶設置權限。在一個大的集羣環境中,我建議你在每臺機器上都創建一個 hadoop的用戶,用它來執行hadoop相關的程序。對於一個單機系統,使用自己的用戶名就可以了。我不推薦使用root用戶來執行hadoop。

啓動HDFS

現在,我們先格式化一下我們剛剛配置的hadoop文件系統。

user@namenode:hadoop$ bin/hadoop namenode -format

這個操作應該值被執行一次,當這個執行完畢之後,我們就可以啓動分佈式系統了。

user@namenode:hadoop$ bin/start-dfs.sh

這個命令將會啓動master機器上的Namenode程序。它也會啓動slave機器上的DataNode程序。在一個單機版的集羣中,slave跟 master是同一臺機器。在一個真實的集羣環境中,這個命令就通過ssh登錄到slave上,並啓動DataNode程序。

Interacting With HDFS

這個部分,我們將會熟悉與HDFS交互、存儲文件、獲取文件所需要用到的一些命令。

大多數命名都是由 bin/hadoop 腳本執行的。它將會在java虛擬機上加載hadoop系統,並執行用戶地方命令。這些命令通常有下列的格式。

user@machine:hadoop$ bin/hadoop moduleName -cmd args…

The moduleName 告訴腳本程序,要使用哪個hadoop模塊。-cmd 在這被指定模塊支持的,要執行的命令名稱。緊跟在命令名稱後面的是該命令的參數。

HDFS主要的模塊有: dfs 和 dfsadmin。它們的使用將會在下面介紹。

通用操作的例子

dfs 模塊,我們也叫它“FsShell”,提供基本的文件處理功能。以下是它的一些用法介紹。

集羣之所以有用,是因爲,它存有我們感興趣的數據。所以,我們要介紹的第一個操作是,往集羣裏面寫數據。我們假定用戶爲“someone”,這個 要根據你的實際情況而定。操作是可以在任何一臺能夠訪問到集羣的機器上進行的,其中,conf/hadoop-site.xml文件必須設爲集羣中 NameNode的地址。命令可以在安裝目錄下被運行,安裝目錄可以是/home/someone/src/hadoop也可以是/home/foo /hadoop,具體隨你自己的情況而定。下面介紹的命令,主要是關於將數據導入HDFS,驗證數據是不是真的導入了,並將數據導出來。

列出文件

當我們試圖使用HDFS的時候,會發現它並沒有想象中的有趣:

someone@anynode:hadoop$ bin/hadoop dfs -ls
someone@anynode:hadoop$

沒有帶參數的這個“-ls”命令,沒有返回任何值,它默認返回你在HDFS“home”目錄下的內容,這個目錄跟我們平常系統上的home目錄 “/home/$user”不太一樣(HDFS跟本地系統是獨立的)。在HDFS中,沒有當前工作目錄這樣的一個概念,也沒有cd這個命令。

給-ls一些參數,比如說/,或許可以看到以下的內容:

someone@anynode:hadoop$ bin/hadoop dfs -ls /
Found 2 items
drwxr-xr-x   – hadoop supergroup          0 2008-09-20 19:40 /hadoop
drwxr-xr-x   – hadoop supergroup          0 2008-09-20 20:08 /tmp

這些結果是由系統產生的,結果中的”hadoop”是我們用來啓動的Hadoop的用戶,supergroup是包含hadoop的一個組。這些目錄允許 Hadoop MapReduce system 將數據移動到不同的結點上。具體的細節在Module 4中介紹.

我們要創建我們自己的home目錄,然後導入一些文件。

導入數據

典型的UNIX或Linux將用戶文件存儲在/home/$user目錄下,但是hadoop將用戶文件存儲在/home/$user下。對於某些 命令,例如 ls,目錄參數是被要求有的,但實際上卻沒有填寫,這時候的目錄參數的值爲默認目錄。(其他的命令一般要求明確的源路徑和目的路徑)。在HDFS中使用的 相對路徑,都是基於剛剛介紹的基本路徑的(也即是用戶目錄)。

Step 1: 如果你的用戶目錄還不存在,那麼創建一個吧

someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user

如果沒有/user目錄,那麼首先要先創建它。它其實會被自動創建的,但是爲了介紹的目的,我們先手動的創建一下這個目錄。

下面我們就可以創建我們的home目錄了。

someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user/someone

將 /user/someone 改成 /user/yourUserName.

Step 2: 導入一個文件。我們可以使用”put”命令。

someone@anynode:hadoop$ bin/hadoop dfs -put /home/someone/interestingFile.txt /user/yourUserName/

它將會把 /home/someone/interestingFile.txt從本地文件系統中拷貝到 HDFS的 /user/yourUserName/interestingFile.txt 。

Step 3: 驗證剛纔的操作。這裏我們有兩個命令可以使用,它們是等效的:

someone@anynode:hadoop$ bin/hadoop dfs -ls /user/yourUserName
someone@anynode:hadoop$ bin/hadoop dfs -ls

你應該能夠看見一個文件列表,它的前面是”Found 1 items”的字樣,文件列表裏面包含了你剛剛插入的文件。

The following table demonstrates example uses of the put command, and their effects:

下面這個列表將展示“put”命令的用法,以及它們的效果。

Command: 前提條件: 輸出:
bin/hadoop dfs -put foo bar 在 HDFS中沒有/user/$User/bar這樣的文件存在 將本地文件foo上傳到hdfs系統,並命名爲/user/$USER/bar
bin/hadoop dfs -put foo bar /user/$USER/bar 是一個目錄 將本地文件foo上傳到hdfs系統,並命名爲/user/$USER/bar/foo
bin/hadoop dfs -put foo somedir/somefile /user/$USER/somedir 不存在 將本地文件foo上傳到hdfs系統,並命名爲 /user/$USER/somedir/somefile, 創建沒有存在的目錄
bin/hadoop dfs -put foo bar /user/$USER/bar 已經是系統中的一個文件 操作無效,系統將返回一個錯誤給用戶。

當執行一個”put”操作時,它的結果是要麼全做,要麼全不做。上傳文件的時候,文件首先被拷貝到DataNode節點上。當所有的 DataNode都接收完數據的時候,文件句柄被關閉,這個文件才真正的上傳完。根據”put”命令的返回值,我們可以知道這個操作是成功了,還是完全失 敗了。文件不可能會只被上傳一半。如果文件上傳到一半時,上傳操作被中斷了,那麼hdfs就會當作什麼事情也沒有發生一樣。

Step 4: 一次上傳多個文件. “put”命令是可以一次上傳多個命令的,它能夠將一整個目錄上傳到HDFS中。

創建一個本地目錄,然後往裏面拷一些文件。情況像下面的那樣。

someone@anynode:hadoop$ ls -R myfiles
myfiles:
file1.txt  file2.txt  subdir/

myfiles/subdir:
anotherFile.txt
someone@anynode:hadoop$

目錄 myfiles/能夠這樣被拷貝進HDFS中:

someone@anynode:hadoop$ bin/hadoop -put myfiles /user/myUsername
someone@anynode:hadoop$ bin/hadoop -ls
Found 1 items
/user/someone/myfiles   <dir>    2008-06-12 20:59    rwxr-xr-x    someone    supergroup
user@anynode:hadoop bin/hadoop -ls myfiles
Found 3 items
/user/someone/myfiles/file1.txt   <r 1>   186731  2008-06-12 20:59        rw-r–r–       someone   supergroup
/user/someone/myfiles/file2.txt   <r 1>   168     2008-06-12 20:59        rw-r–r–       someone   supergroup
/user/someone/myfiles/subdir      <dir>           2008-06-12 20:59        rwxr-xr-x       someone   supergroup

上面的例子也證明了,這個目錄是完全的被拷貝進來了。注意文件路徑旁邊的<r 1>,裏面的數字1 表示備份的數量是1。同時ls命令也列出了文件大小,上傳時間,權限,所有者這些信息。

-put 的另外一種寫法是 -copyFromLocal. 它們的功能和用法是一樣的。

從 HDFS中導出數據

從HDFS中導出數據是有許多的方法的,最簡單的那種應該是使用”cat”將一個文件的內容輸出到標準輸出上。(當然,它也能夠作爲參數傳到程序裏面,或者是其他地方)

Step 1: cat 命令.

在這個例子中,我們假定你已經傳了一些文件進入你的HDFS中了。

someone@anynode:hadoop$ bin/hadoop dfs -cat foo
(contents of foo are displayed here)
someone@anynode:hadoop$

Step 2: 將HDFS中的文件拷貝到本地系統中。

“get”命令有跟”put”命令相反的功能,它能夠將HDFS中文件或目錄拷貝到本地系統中。“get”命令的別名叫做copyToLocal.

someone@anynode:hadoop$ bin/hadoop dfs -get foo localFoo
someone@anynode:hadoop$ ls
localFoo
someone@anynode:hadoop$ cat localFoo
(contents of foo are displayed here)

跟 “put”命令一樣,”get”操作既可以操作文件,也可以操作目錄。

HDFS的關閉

如果你想關閉集羣上的HDFS系統,你可以在NameNode結點執行以下的命令:

someone@namenode:hadoop$ bin/stop-dfs.sh

這個命令必須由啓動HDFS的用戶來執行。

HDFS 命令參考

當然 bin/hadoop dfs 的命令遠不只這幾個,不過這些命令已經可以讓你開始使用HDFS了。執行沒有帶參數的bin/hadoop dfs命令,會列出所有的FsShell system的命令。 bin/hadoop dfs -helpcommandName 會列出某一個具體的命令的用法指南。

所有的命令都作爲一個表格列在下面了,這裏是這個表格的一些註釋:

  • italics 表示這個變量是用戶應該填的。
  • “path”  一個文件名,或者目錄名。
  • “path…” 多個文件名,或者多個目錄名。
  • “file” 任何文件名.
  • “src” and “dest”  路徑名稱。
  • “localSrc” and “localDest” 跟上面的路徑類似,只不過限定在了本地系統中。其他形式的路徑都表示HDFS中的路徑。
  • 在”[]“裏面的參數是可選的。
Command Operation
-ls path Lists the contents of the directory specified by path, showing the names, permissions, owner, size and modification date for each entry.
-lsr path Behaves like -ls, but recursively displays entries in all subdirectories of path.
-du path Shows disk usage, in bytes, for all files which match path; filenames are reported with the full HDFS protocol prefix.
-dus path Like -du, but prints a summary of disk usage of all files/directories in the path.
-mv src dest Moves the file or directory indicated by src to dest, within HDFS.
-cp src dest Copies the file or directory identified by src to dest, within HDFS.
-rm path Removes the file or empty directory identified by path.
-rmr path Removes the file or directory identified by path. Recursively deletes any child entries (i.e., files or subdirectories of path).
-put localSrc dest Copies the file or directory from the local file system identified by localSrc to dest within the DFS.
-copyFromLocal localSrcdest Identical to -put
-moveFromLocallocalSrc dest Copies the file or directory from the local file system identified by localSrc to dest within HDFS, then deletes the local copy on success.
-get [-crc] src localDest Copies the file or directory in HDFS identified by src to the local file system path identified by localDest.
-getmerge src localDest[addnl] Retrieves all files that match the path src in HDFS, and copies them to a single, merged file in the local file system identified by localDest.
-cat filename Displays the contents of filename on stdout.
-copyToLocal [-crc] srclocalDest Identical to -get
-moveToLocal [-crc] srclocalDest Works like -get, but deletes the HDFS copy on success.
-mkdir path Creates a directory named path in HDFS. Creates any parent directories in path that are missing (e.g., like mkdir -p in Linux).
-setrep [-R] [-w] rep path Sets the target replication factor for files identified by path to rep. (The actual replication factor will move toward the target over time)
-touchz path Creates a file at path containing the current time as a timestamp. Fails if a file already exists at path, unless the file is already size 0.
-test -[ezd] path Returns 1 if path exists; has zero length; or is a directory, or 0 otherwise.
-stat [format] path Prints information about pathformat is a string which accepts file size in blocks (%b), filename (%n), block size (%o), replication (%r), and modification date (%y, %Y).
-tail [-f] file Shows the lats 1KB of file on stdout.
-chmod [-R] mode,mode,… path… Changes the file permissions associated with one or more objects identified by path…. Performs changes recursively with -Rmode is a 3-digit octal mode, or {augo}+/-{rwxX}. Assumes a if no scope is specified and does not apply a umask.
-chown [-R] [owner][:[group]] path… Sets the owning user and/or group for files or directories identified by path…. Sets owner recursively if -R is specified.
-chgrp [-R] group path… Sets the owning group for files or directories identified by path…. Sets group recursively if -R is specified.
-help cmd Returns usage information for one of the commands listed above. You must omit the leading ‘-’ character in cmd

DFSAdmin 命令參考

”dfs”模塊提供了對文件和目錄的操作命令,”dfsadmin”則提供了管理整個文件系統的操作。

全局狀態信息: 通過 bin/hadoop dfsadmin -report命令,我們可以得到一份全局狀態報告。這份報告包含了HDFS集羣的基本信息,當然也有每臺機器的一些情況。

詳細的狀態信息: 如果你想要知道關於文件的詳細信息,你可以使用bin/hadoop dfsadmin -metasave filename 命令,filename是你要查看的文件的名稱。NB:它的幫助說,這個命令可以得到NameNode 的主要的結構,這個說法是不恰當的。從這個命令所返回的信息無法得到NameNode的狀態。不過,它卻說明了,NameNode是怎麼樣存儲HDFS的文件塊的。

Safemode: 在Safemode(安全模式) 下,HDFS是隻讀的。任何的複製,創建,刪除操作都是禁止的。在NameNode啓動的時候,系統會自動進入這個模式,DataNode 會在這時候註冊到NameNode中,並告訴NameNode它們擁有哪些文件塊,NameNode由此知道哪些文件塊的備份被丟失了。一直到一定百分比 的的數量的DataNodes正常工作後,NameNode會退出安全模式。這個百分比在dfs.safemode.threshold.pct 中配置。當達到一定的百分比的時候,安全模式會自動退出,HDFS就允許正常操作了。用戶可以通過dfsadmin -safemode what 來操作安全模式,參數what的說明如下:

改變 HDFS 成員組成 - 刪除結點的時候,我們要按步驟的和結點斷開鏈接以保證數據不會丟失。關於decommissioning 命令的一些詳細的信息,我們會在後面討論。

升級 HDFS - 但HDFS從一個版本升級到另外一個版本的時候,NameNode和DataNode使用的文件格式有可能會改變。當你第一次使用新版本的時候,你要使用 bin/start-dfs.sh -upgrade告訴Hadoop 去改變HDFS版本(否則,新版本不會生效)。然後它開始升級,你可以通過 bin/hadoop dfsadmin -upgradeProgress 命令來查看版本升級的情況。當然你可以使用bin/hadoop dfsadmin -upgradeProgress details來查看更多的詳細信息。當升級過程被阻塞的時候,你可以使用bin/hadoop dfsadmin -upgradeProgress force 來強制升級繼續執行(當你使用這個命令的時候,一定要慎重考慮)。

當HDFS升級完畢後,Hadoop依舊保留着舊版本的有關信息,以便你可以方便的對HDFS進行降級操作。你可以使用bin/start-dfs.sh -rollback來執行降級操作。

Hadoop一次只保存一個版本的備份。當新版本運行幾天以後還是沒有出現什麼問題,你就可以使用bin/hadoop dfsadmin -finalizeUpgrade命令把舊版本的備份從系統中刪掉了。刪除以後rollback 命令就失效了。在另外一次版本升級前,這個操作是一定要 做的。

獲取幫助 - 跟 dfs 模塊是一樣的, 你可以使用 bin/hadoop dfsadmin -help命令來獲取特定的命令的一些用法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章