配置HDFS
配置HDFS應(yīng)該是一件不難的事情。首先,我們先配好HDFS的配置文件,再對(duì)NameNode進(jìn)行format操作。
配置Cluster
這里,我們假定,你已經(jīng)下載了Hadoop的一個(gè)版本,并解壓完畢。
Hadoop安裝目錄下的conf是hadoop存放配置文件的目錄,里面有一些XML文件需要配置。conf/hadoop-defaults.xml 文件包含了hadoop的任何參數(shù)的默認(rèn)值。這個(gè)文件應(yīng)該是只讀的。你可以通過在conf/hadoop-site.xml中設(shè)置新值的方式來覆蓋默認(rèn)的配置。集群上所有的機(jī)器的hadoop-site.xml文件應(yīng)該是一致的。
配置文件本身是鍵值對(duì)的一個(gè)集合。
- <property>
- <name>property-name</name>
- <value>property-value</value>
- </property>
<property>
<name>property-name</name>
<value>property-value</value>
</property>
property 中有 <final>true</final> 這樣的一行的,則表示這個(gè)屬性是不能被用戶應(yīng)用程序覆蓋的。
下面的一些屬性是必須要配置的,這樣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 - 這是一個(gè)描述集群中NameNode結(jié)點(diǎn)的URI(包括協(xié)議、主機(jī)名稱、端口號(hào)),集群里面的每一臺(tái)機(jī)器都需要知道NameNode的地址。DataNode結(jié)點(diǎn)會(huì)先在NameNode上注冊(cè),這樣它們的數(shù)據(jù)才可以被使用。獨(dú)立的客戶端程序通過這個(gè)URI跟DataNode交互,以取得文件的塊列表。
dfs.data.dir - 這是DataNode結(jié)點(diǎn)被指定要存儲(chǔ)數(shù)據(jù)的本地文件系統(tǒng)路徑。DataNode結(jié)點(diǎn)上的這個(gè)路徑?jīng)]有必要完全相同,因?yàn)槊颗_(tái)機(jī)器的環(huán)境很可能是不一樣的。但如果每臺(tái)機(jī)器上的這個(gè)路徑都是統(tǒng)一配置的話,會(huì)使工作變得簡單一些。默認(rèn)的情況下,它的值是/temp, 這個(gè)路徑只能用于測(cè)試的目的,因?yàn)?,它很可能?huì)丟失掉一些數(shù)據(jù)。所以,這個(gè)值最好還是被覆蓋。
dfs.name.dir - 這是NameNode結(jié)點(diǎn)存儲(chǔ)hadoop文件系統(tǒng)信息的本地系統(tǒng)路徑。這個(gè)值只對(duì)NameNode有效,DataNode并不需要使用到它。上面對(duì)于/temp類型的警告,同樣也適用于這里。在實(shí)際應(yīng)用中,它最好被覆蓋掉。
這里再介紹一個(gè)配置參數(shù),它叫dfs.replication 。它決定著 系統(tǒng)里面的文件塊的數(shù)據(jù)備份個(gè)數(shù)。對(duì)于一個(gè)實(shí)際的應(yīng)用,它 應(yīng)該被設(shè)為3(這個(gè)數(shù)字并沒有上限,但更多的備份可能并沒有作用,而且會(huì)占用更多的空間)。少于三個(gè)的備份,可能會(huì)影響到數(shù)據(jù)的可靠性(系統(tǒng)故障時(shí),也許會(huì)造成數(shù)據(jù)丟失)。
下面是一個(gè)模板文件。
- <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>
<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 需要被配置成正確的主機(jī)名,端口號(hào)的指定是隨意的。
配置好conf/hadoop-site.xml文件以后,你可以將conf目錄拷貝到其他的機(jī)器上了。
master結(jié)點(diǎn)有必要知道集群里其他機(jī)器的的地址,這樣啟動(dòng)腳本才能正常運(yùn)行。conf/slaves這個(gè)文件列舉了所有的可用的主機(jī)名,一個(gè)主機(jī)名一行。在一個(gè)集群的環(huán)境中,這個(gè)文件不需要包含master的地址。但是單機(jī)的情況下,master也要有,因?yàn)槌薽aster以外,沒有其他的機(jī)器可以作為DataNode結(jié)點(diǎn)了。
然后,建立我們要使用的目錄:
- user@EachMachine$ mkdir -p $HOME/hdfs/data
-
- user@namenode$ mkdir -p $HOME/hdfs/name
user@EachMachine$ mkdir -p $HOME/hdfs/data
user@namenode$ mkdir -p $HOME/hdfs/name
執(zhí)行Hadoop的用戶需要這些目錄的讀寫權(quán)限,使用chmod命令為該用戶設(shè)置權(quán)限。在一個(gè)大的集群環(huán)境中,我建議你在每臺(tái)機(jī)器上都創(chuàng)建一個(gè)hadoop的用戶,用它來執(zhí)行hadoop相關(guān)的程序。對(duì)于一個(gè)單機(jī)系統(tǒng),使用自己的用戶名就可以了。我不推薦使用root用戶來執(zhí)行hadoop。
啟動(dòng)HDFS
現(xiàn)在,我們先格式化一下我們剛剛配置的hadoop文件系統(tǒng)。
- user@namenode:hadoop$ bin/hadoop namenode -format
user@namenode:hadoop$ bin/hadoop namenode -format
這個(gè)操作應(yīng)該值被執(zhí)行一次,當(dāng)這個(gè)執(zhí)行完畢之后,我們就可以啟動(dòng)分布式系統(tǒng)了。
- user@namenode:hadoop$ bin/start-dfs.sh
user@namenode:hadoop$ bin/start-dfs.sh
這個(gè)命令將會(huì)啟動(dòng)master機(jī)器上的Namenode程序。它也會(huì)啟動(dòng)slave機(jī)器上的DataNode程序。在一個(gè)單機(jī)版的集群中,slave跟master是同一臺(tái)機(jī)器。在一個(gè)真實(shí)的集群環(huán)境中,這個(gè)命令就通過ssh登錄到slave上,并啟動(dòng)DataNode程序。
Interacting With HDFS
這個(gè)部分,我們將會(huì)熟悉與HDFS交互、存儲(chǔ)文件、獲取文件所需要用到的一些命令。
大多數(shù)命名都是由 bin/hadoop 腳本執(zhí)行的。它將會(huì)在java虛擬機(jī)上加載hadoop系統(tǒng),并執(zhí)行用戶地方命令。這些命令通常有下列的格式。
- user@machine:hadoop$ bin/hadoop moduleName -cmd args...
user@machine:hadoop$ bin/hadoop moduleName -cmd args...
The moduleName 告訴腳本程序,要使用哪個(gè)hadoop模塊。-cmd 在這被指定模塊支持的,要執(zhí)行的命令名稱。緊跟在命令名稱后面的是該命令的參數(shù)。
HDFS主要的模塊有: dfs 和 dfsadmin。它們的使用將會(huì)在下面介紹。
通用操作的例子
dfs 模塊,我們也叫它“FsShell”,提供基本的文件處理功能。以下是它的一些用法介紹。
集群之所以有用,是因?yàn)椋嬗形覀兏信d趣的數(shù)據(jù)。所以,我們要介紹的第一個(gè)操作是,往集群里面寫數(shù)據(jù)。我們假定用戶為“someone”,這個(gè)要根據(jù)你的實(shí)際情況而定。操作是可以在任何一臺(tái)能夠訪問到集群的機(jī)器上進(jìn)行的,其中,conf/hadoop-site.xml文件必須設(shè)為集群中NameNode的地址。命令可以在安裝目錄下被運(yùn)行,安裝目錄可以是/home/someone/src/hadoop也可以是/home/foo/hadoop,具體隨你自己的情況而定。下面介紹的命令,主要是關(guān)于將數(shù)據(jù)導(dǎo)入HDFS,驗(yàn)證數(shù)據(jù)是不是真的導(dǎo)入了,并將數(shù)據(jù)導(dǎo)出來。
列出文件
當(dāng)我們?cè)噲D使用HDFS的時(shí)候,會(huì)發(fā)現(xiàn)它并沒有想象中的有趣:
- someone@anynode:hadoop$ bin/hadoop dfs -ls
- someone@anynode:hadoop$
someone@anynode:hadoop$ bin/hadoop dfs -ls
someone@anynode:hadoop$
沒有帶參數(shù)的這個(gè)“-ls”命令,沒有返回任何值,它默認(rèn)返回你在HDFS“home”目錄下的內(nèi)容,這個(gè)目錄跟我們平常系統(tǒng)上的home目錄 “/home/$user”不太一樣(HDFS跟本地系統(tǒng)是獨(dú)立的)。在HDFS中,沒有當(dāng)前工作目錄這樣的一個(gè)概念,也沒有cd這個(gè)命令。
給-ls一些參數(shù),比如說/,或許可以看到以下的內(nèi)容:
- 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
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
這些結(jié)果是由系統(tǒng)產(chǎn)生的,結(jié)果中的"hadoop"是我們用來啟動(dòng)的Hadoop的用戶,supergroup是包含hadoop的一個(gè)組。這些目錄允許 Hadoop MapReduce system 將數(shù)據(jù)移動(dòng)到不同的結(jié)點(diǎn)上。具體的細(xì)節(jié)在Module 4中介紹.
我們要?jiǎng)?chuàng)建我們自己的home目錄,然后導(dǎo)入一些文件。
導(dǎo)入數(shù)據(jù)
典型的UNIX或Linux將用戶文件存儲(chǔ)在/home/$user目錄下,但是hadoop將用戶文件存儲(chǔ)在/home/$user下。對(duì)于某些命令,例如 ls,目錄參數(shù)是被要求有的,但實(shí)際上卻沒有填寫,這時(shí)候的目錄參數(shù)的值為默認(rèn)目錄。(其他的命令一般要求明確的源路徑和目的路徑)。在HDFS中使用的相對(duì)路徑,都是基于剛剛介紹的基本路徑的(也即是用戶目錄)。
Step 1: 如果你的用戶目錄還不存在,那么創(chuàng)建一個(gè)吧
- someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user
如果沒有/user目錄,那么首先要先創(chuàng)建它。它其實(shí)會(huì)被自動(dòng)創(chuàng)建的,但是為了介紹的目的,我們先手動(dòng)的創(chuàng)建一下這個(gè)目錄。
下面我們就可以創(chuàng)建我們的home目錄了。
- someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user/someone
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user/someone
將 /user/someone 改成 /user/yourUserName.
Step 2: 導(dǎo)入一個(gè)文件。我們可以使用"put"命令。
- someone@anynode:hadoop$ bin/hadoop dfs -put /home/someone/interestingFile.txt /user/yourUserName/
someone@anynode:hadoop$ bin/hadoop dfs -put /home/someone/interestingFile.txt /user/yourUserName/
它將會(huì)把 /home/someone/interestingFile.txt從本地文件系統(tǒng)中拷貝到 HDFS的 /user/yourUserName/interestingFile.txt 。
Step 3: 驗(yàn)證剛才的操作。這里我們有兩個(gè)命令可以使用,它們是等效的:
- someone@anynode:hadoop$ bin/hadoop dfs -ls /user/yourUserName
- someone@anynode:hadoop$ bin/hadoop dfs -ls
someone@anynode:hadoop$ bin/hadoop dfs -ls /user/yourUserName
someone@anynode:hadoop$ bin/hadoop dfs -ls
你應(yīng)該能夠看見一個(gè)文件列表,它的前面是"Found 1 items"的字樣,文件列表里面包含了你剛剛插入的文件。
The following table demonstrates example uses of the put command, and their effects:
下面這個(gè)列表將展示“put”命令的用法,以及它們的效果。
| Command: |
前提條件: |
輸出: |
| bin/hadoop dfs -put foo bar |
在 HDFS中沒有/user/$User/bar這樣的文件存在 |
將本地文件foo上傳到hdfs系統(tǒng),并命名為/user/$USER/bar |
| bin/hadoop dfs -put foo bar |
/user/$USER/bar 是一個(gè)目錄 |
將本地文件foo上傳到hdfs系統(tǒng),并命名為/user/$USER/bar/foo |
| bin/hadoop dfs -put foo somedir/somefile |
/user/$USER/somedir 不存在 |
將本地文件foo上傳到hdfs系統(tǒng),并命名為 /user/$USER/somedir/somefile, 創(chuàng)建沒有存在的目錄 |
| bin/hadoop dfs -put foo bar |
/user/$USER/bar 已經(jīng)是系統(tǒng)中的一個(gè)文件 |
操作無效,系統(tǒng)將返回一個(gè)錯(cuò)誤給用戶。 |
當(dāng)執(zhí)行一個(gè)"put"操作時(shí),它的結(jié)果是要么全做,要么全不做。上傳文件的時(shí)候,文件首先被拷貝到DataNode節(jié)點(diǎn)上。當(dāng)所有的DataNode都接收完數(shù)據(jù)的時(shí)候,文件句柄被關(guān)閉,這個(gè)文件才真正的上傳完。根據(jù)"put"命令的返回值,我們可以知道這個(gè)操作是成功了,還是完全失敗了。文件不可能會(huì)只被上傳一半。如果文件上傳到一半時(shí),上傳操作被中斷了,那么hdfs就會(huì)當(dāng)作什么事情也沒有發(fā)生一樣。
Step 4: 一次上傳多個(gè)文件. "put"命令是可以一次上傳多個(gè)命令的,它能夠?qū)⒁徽麄€(gè)目錄上傳到HDFS中。
創(chuàng)建一個(gè)本地目錄,然后往里面拷一些文件。情況像下面的那樣。
- someone@anynode:hadoop$ ls -R myfiles
- myfiles:
- file1.txt file2.txt subdir/
-
- myfiles/subdir:
- anotherFile.txt
- someone@anynode:hadoop$
someone@anynode:hadoop$ ls -R myfiles
myfiles:
file1.txt file2.txt subdir/
myfiles/subdir:
anotherFile.txt
someone@anynode:hadoop$
目錄 myfiles/能夠這樣被拷貝進(jìn)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
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
上面的例子也證明了,這個(gè)目錄是完全的被拷貝進(jìn)來了。注意文件路徑旁邊的<r 1>,里面的數(shù)字1 表示備份的數(shù)量是1。同時(shí)ls命令也列出了文件大小,上傳時(shí)間,權(quán)限,所有者這些信息。
-put 的另外一種寫法是 -copyFromLocal. 它們的功能和用法是一樣的。
從 HDFS中導(dǎo)出數(shù)據(jù)
從HDFS中導(dǎo)出數(shù)據(jù)是有許多的方法的,最簡單的那種應(yīng)該是使用"cat"將一個(gè)文件的內(nèi)容輸出到標(biāo)準(zhǔn)輸出上。(當(dāng)然,它也能夠作為參數(shù)傳到程序里面,或者是其他地方)
Step 1: cat 命令.
在這個(gè)例子中,我們假定你已經(jīng)傳了一些文件進(jìn)入你的HDFS中了。
- someone@anynode:hadoop$ bin/hadoop dfs -cat foo
- (contents of foo are displayed here)
- someone@anynode:hadoop$
someone@anynode:hadoop$ bin/hadoop dfs -cat foo
(contents of foo are displayed here)
someone@anynode:hadoop$
Step 2: 將HDFS中的文件拷貝到本地系統(tǒng)中。
"get"命令有跟"put"命令相反的功能,它能夠?qū)DFS中文件或目錄拷貝到本地系統(tǒng)中。“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)
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的關(guān)閉
如果你想關(guān)閉集群上的HDFS系統(tǒng),你可以在NameNode結(jié)點(diǎn)執(zhí)行以下的命令:
- someone@namenode:hadoop$ bin/stop-dfs.sh
someone@namenode:hadoop$ bin/stop-dfs.sh
這個(gè)命令必須由啟動(dòng)HDFS的用戶來執(zhí)行。
HDFS 命令參考
當(dāng)然 bin/hadoop dfs 的命令遠(yuǎn)不只這幾個(gè),不過這些命令已經(jīng)可以讓你開始使用HDFS了。執(zhí)行沒有帶參數(shù)的bin/hadoop dfs命令,會(huì)列出所有的FsShell system的命令。 bin/hadoop dfs -help commandName 會(huì)列出某一個(gè)具體的命令的用法指南。
所有的命令都作為一個(gè)表格列在下面了,這里是這個(gè)表格的一些注釋:
- italics 表示這個(gè)變量是用戶應(yīng)該填的。
- "path" 一個(gè)文件名,或者目錄名。
- "path..." 多個(gè)文件名,或者多個(gè)目錄名。
- "file" 任何文件名.
- "src" and "dest" 路徑名稱。
- "localSrc" and "localDest" 跟上面的路徑類似,只不過限定在了本地系統(tǒng)中。其他形式的路徑都表示HDFS中的路徑。
- 在"[]"里面的參數(shù)是可選的。
| 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 localSrc dest |
Identical to -put |
| -moveFromLocal localSrc 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] src localDest |
Identical to -get |
| -moveToLocal [-crc] src localDest |
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 path. format 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 -R. mode 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"模塊提供了對(duì)文件和目錄的操作命令,"dfsadmin"則提供了管理整個(gè)文件系統(tǒng)的操作。
全局狀態(tài)信息: 通過 bin/hadoop dfsadmin -report命令,我們可以得到一份全局狀態(tài)報(bào)告。這份報(bào)告包含了HDFS集群的基本信息,當(dāng)然也有每臺(tái)機(jī)器的一些情況。
詳細(xì)的狀態(tài)信息: 如果你想要知道關(guān)于文件的詳細(xì)信息,你可以使用bin/hadoop dfsadmin -metasave filename 命令,filename是你要查看的文件的名稱。NB:它的幫助說,這個(gè)命令可以得到NameNode 的主要的結(jié)構(gòu),這個(gè)說法是不恰當(dāng)?shù)?。從這個(gè)命令所返回的信息無法得到NameNode的狀態(tài)。不過,它卻說明了,NameNode是怎么樣存儲(chǔ)HDFS的文件塊的。
Safemode: 在Safemode(安全模式) 下,HDFS是只讀的。任何的復(fù)制,創(chuàng)建,刪除操作都是禁止的。在NameNode啟動(dòng)的時(shí)候,系統(tǒng)會(huì)自動(dòng)進(jìn)入這個(gè)模式,DataNode 會(huì)在這時(shí)候注冊(cè)到NameNode中,并告訴NameNode它們擁有哪些文件塊,NameNode由此知道哪些文件塊的備份被丟失了。一直到一定百分比的的數(shù)量的DataNodes正常工作后,NameNode會(huì)退出安全模式。這個(gè)百分比在dfs.safemode.threshold.pct 中配置。當(dāng)達(dá)到一定的百分比的時(shí)候,安全模式會(huì)自動(dòng)退出,HDFS就允許正常操作了。用戶可以通過dfsadmin -safemode what 來操作安全模式,參數(shù)what的說明如下:
- enter - 進(jìn)入安全模式
- leave - 強(qiáng)制NameNode離開安全模式
- get - 返回安全模式是否開啟的信息
- wait - 等待,一直到安全模式結(jié)束。
改變 HDFS 成員組成 - 刪除結(jié)點(diǎn)的時(shí)候,我們要按步驟的和結(jié)點(diǎn)斷開鏈接以保證數(shù)據(jù)不會(huì)丟失。關(guān)于decommissioning 命令的一些詳細(xì)的信息,我們會(huì)在后面討論。
升級(jí) HDFS - 但HDFS從一個(gè)版本升級(jí)到另外一個(gè)版本的時(shí)候,NameNode和DataNode使用的文件格式有可能會(huì)改變。當(dāng)你第一次使用新版本的時(shí)候,你要使用bin/start-dfs.sh -upgrade告訴Hadoop 去改變HDFS版本(否則,新版本不會(huì)生效)。然后它開始升級(jí),你可以通過 bin/hadoop dfsadmin -upgradeProgress 命令來查看版本升級(jí)的情況。當(dāng)然你可以使用bin/hadoop dfsadmin -upgradeProgress details來查看更多的詳細(xì)信息。當(dāng)升級(jí)過程被阻塞的時(shí)候,你可以使用bin/hadoop dfsadmin -upgradeProgress force 來強(qiáng)制升級(jí)繼續(xù)執(zhí)行(當(dāng)你使用這個(gè)命令的時(shí)候,一定要慎重考慮)。
當(dāng)HDFS升級(jí)完畢后,Hadoop依舊保留著舊版本的有關(guān)信息,以便你可以方便的對(duì)HDFS進(jìn)行降級(jí)操作。你可以使用bin/start-dfs.sh -rollback來執(zhí)行降級(jí)操作。
Hadoop一次只保存一個(gè)版本的備份。當(dāng)新版本運(yùn)行幾天以后還是沒有出現(xiàn)什么問題,你就可以使用bin/hadoop dfsadmin -finalizeUpgrade命令把舊版本的備份從系統(tǒng)中刪掉了。刪除以后rollback 命令就失效了。在另外一次版本升級(jí)前,這個(gè)操作是一定要做的。
獲取幫助 - 跟 dfs 模塊是一樣的, 你可以使用 bin/hadoop dfsadmin -help命令來獲取特定的命令的一些用法。