主題:Hadoop分布式系統(中)精華帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隱藏帖 (0)
作者 正文
mxsfengg 等級: 初級會(huì )員
文章: 8 積分: 80 來(lái)自: 廣州
發(fā)表時(shí)間:2008-12-02 關(guān)鍵字: hadoop
引用相關(guān)文章:
HDFS用戶(hù)指南(翻譯)HADOOP的初次嘗試Hadoop分布式文件系統:架構和設計要點(diǎn)(翻譯)推薦圈子:
lucene愛(ài)好者更多相關(guān)推薦配置HDFS
配置HDFS應該是一件不難的事情。首先,我們先配好HDFS的配置文件,再對NameNode進(jìn)行format操作。
配置Cluster
這里,我們假定,你已經(jīng)下載了Hadoop的一個(gè)版本,并解壓完畢。
Hadoop安裝目錄下的conf是hadoop存放配置文件的目錄,里面有一些XML文件需要配置。conf/hadoop-defaults.xml 文件包含了hadoop的任何參數的默認值。這個(gè)文件應該是只讀的。你可以通過(guò)在conf/hadoop-site.xml中設置新值的方式來(lái)覆蓋默認的配置。集群上所有的機器的hadoop-site.xml文件應該是一致的。
配置文件本身是鍵值對的一個(gè)集合。
Xml代碼
<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è)屬性是不能被用戶(hù)應用程序覆蓋的。
下面的一些屬性是必須要配置的,這樣HDFS才能跑起來(lái):
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
這些屬性的有著(zhù)如下的意思:
fs.default.name - 這是一個(gè)描述集群中NameNode結點(diǎn)的URI(包括協(xié)議、主機名稱(chēng)、端口號),集群里面的每一臺機器都需要知道NameNode的地址。DataNode結點(diǎn)會(huì )先在NameNode上注冊,這樣它們的數據才可以被使用。獨立的客戶(hù)端程序通過(guò)這個(gè)URI跟DataNode交互,以取得文件的塊列表。
dfs.data.dir - 這是DataNode結點(diǎn)被指定要存儲數據的本地文件系統路徑。DataNode結點(diǎn)上的這個(gè)路徑?jīng)]有必要完全相同,因為每臺機器的環(huán)境很可能是不一樣的。但如果每臺機器上的這個(gè)路徑都是統一配置的話(huà),會(huì )使工作變得簡(jiǎn)單一些。默認的情況下,它的值是/temp, 這個(gè)路徑只能用于測試的目的,因為,它很可能會(huì )丟失掉一些數據。所以,這個(gè)值最好還是被覆蓋。
dfs.name.dir - 這是NameNode結點(diǎn)存儲hadoop文件系統信息的本地系統路徑。這個(gè)值只對NameNode有效,DataNode并不需要使用到它。上面對于/temp類(lèi)型的警告,同樣也適用于這里。在實(shí)際應用中,它最好被覆蓋掉。
這里再介紹一個(gè)配置參數,它叫dfs.replication 。它決定著(zhù) 系統里面的文件塊的數據備份個(gè)數。對于一個(gè)實(shí)際的應用,它 應該被設為3(這個(gè)數字并沒(méi)有上限,但更多的備份可能并沒(méi)有作用,而且會(huì )占用更多的空間)。少于三個(gè)的備份,可能會(huì )影響到數據的可靠性(系統故障時(shí),也許會(huì )造成數據丟失)。
下面是一個(gè)模板文件。
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>
<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結點(diǎn)有必要知道集群里其他機器的的地址,這樣啟動(dòng)腳本才能正常運行。conf/slaves這個(gè)文件列舉了所有的可用的主機名,一個(gè)主機名一行。在一個(gè)集群的環(huán)境中,這個(gè)文件不需要包含master的地址。但是單機的情況下,master也要有,因為除了master以外,沒(méi)有其他的機器可以作為DataNode結點(diǎn)了。
然后,建立我們要使用的目錄:
Shell代碼
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
執行Hadoop的用戶(hù)需要這些目錄的讀寫(xiě)權限,使用chmod命令為該用戶(hù)設置權限。在一個(gè)大的集群環(huán)境中,我建議你在每臺機器上都創(chuàng )建一個(gè)hadoop的用戶(hù),用它來(lái)執行hadoop相關(guān)的程序。對于一個(gè)單機系統,使用自己的用戶(hù)名就可以了。我不推薦使用root用戶(hù)來(lái)執行hadoop。
啟動(dòng)HDFS
現在,我們先格式化一下我們剛剛配置的hadoop文件系統。
Java代碼
user@namenode:hadoop$ bin/hadoop namenode -format
user@namenode:hadoop$ bin/hadoop namenode -format
這個(gè)操作應該值被執行一次,當這個(gè)執行完畢之后,我們就可以啟動(dòng)分布式系統了。
Shell代碼
user@namenode:hadoop$ bin/start-dfs.sh
user@namenode:hadoop$ bin/start-dfs.sh
這個(gè)命令將會(huì )啟動(dòng)master機器上的Namenode程序。它也會(huì )啟動(dòng)slave機器上的DataNode程序。在一個(gè)單機版的集群中,slave跟master是同一臺機器。在一個(gè)真實(shí)的集群環(huán)境中,這個(gè)命令就通過(guò)ssh登錄到slave上,并啟動(dòng)DataNode程序。
Interacting With HDFS
這個(gè)部分,我們將會(huì )熟悉與HDFS交互、存儲文件、獲取文件所需要用到的一些命令。
大多數命名都是由 bin/hadoop 腳本執行的。它將會(huì )在java虛擬機上加載hadoop系統,并執行用戶(hù)地方命令。這些命令通常有下列的格式。
Shell代碼
user@machine:hadoop$ bin/hadoop moduleName -cmd args...
user@machine:hadoop$ bin/hadoop moduleName -cmd args...
The moduleName 告訴腳本程序,要使用哪個(gè)hadoop模塊。-cmd 在這被指定模塊支持的,要執行的命令名稱(chēng)。緊跟在命令名稱(chēng)后面的是該命令的參數。
HDFS主要的模塊有: dfs 和 dfsadmin。它們的使用將會(huì )在下面介紹。
通用操作的例子
dfs 模塊,我們也叫它“FsShell”,提供基本的文件處理功能。以下是它的一些用法介紹。
集群之所以有用,是因為,它存有我們感興趣的數據。所以,我們要介紹的第一個(gè)操作是,往集群里面寫(xiě)數據。我們假定用戶(hù)為“someone”,這個(gè)要根據你的實(shí)際情況而定。操作是可以在任何一臺能夠訪(fǎng)問(wèn)到集群的機器上進(jìn)行的,其中,conf/hadoop-site.xml文件必須設為集群中NameNode的地址。命令可以在安裝目錄下被運行,安裝目錄可以是/home/someone/src/hadoop也可以是/home/foo/hadoop,具體隨你自己的情況而定。下面介紹的命令,主要是關(guān)于將數據導入HDFS,驗證數據是不是真的導入了,并將數據導出來(lái)。
列出文件
當我們試圖使用HDFS的時(shí)候,會(huì )發(fā)現它并沒(méi)有想象中的有趣:
Shell代碼
someone@anynode:hadoop$ bin/hadoop dfs -ls
someone@anynode:hadoop$
someone@anynode:hadoop$ bin/hadoop dfs -ls someone@anynode:hadoop$
沒(méi)有帶參數的這個(gè)“-ls”命令,沒(méi)有返回任何值,它默認返回你在HDFS“home”目錄下的內容,這個(gè)目錄跟我們平常系統上的home目錄 “/home/$user”不太一樣(HDFS跟本地系統是獨立的)。在HDFS中,沒(méi)有當前工作目錄這樣的一個(gè)概念,也沒(méi)有cd這個(gè)命令。
給-ls一些參數,比如說(shuō)/,或許可以看到以下的內容:
Shell代碼
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
這些結果是由系統產(chǎn)生的,結果中的"hadoop"是我們用來(lái)啟動(dòng)的Hadoop的用戶(hù),supergroup是包含hadoop的一個(gè)組。這些目錄允許 Hadoop MapReduce system 將數據移動(dòng)到不同的結點(diǎn)上。具體的細節在
Module 4中介紹.
我們要創(chuàng )建我們自己的home目錄,然后導入一些文件。
導入數據
典型的UNIX或Linux將用戶(hù)文件存儲在/home/$user目錄下,但是hadoop將用戶(hù)文件存儲在/home/$user下。對于某些命令,例如 ls,目錄參數是被要求有的,但實(shí)際上卻沒(méi)有填寫(xiě),這時(shí)候的目錄參數的值為默認目錄。(其他的命令一般要求明確的源路徑和目的路徑)。在HDFS中使用的相對路徑,都是基于剛剛介紹的基本路徑的(也即是用戶(hù)目錄)。
Step 1: 如果你的用戶(hù)目錄還不存在,那么創(chuàng )建一個(gè)吧
Shell代碼
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user
如果沒(méi)有/user目錄,那么首先要先創(chuàng )建它。它其實(shí)會(huì )被自動(dòng)創(chuàng )建的,但是為了介紹的目的,我們先手動(dòng)的創(chuàng )建一下這個(gè)目錄。
下面我們就可以創(chuàng )建我們的home目錄了。
Shell代碼
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user/someone
someone@anynode:hadoop$ bin/hadoop dfs -mkdir /user/someone
將 /user/someone 改成 /user/yourUserName.
Step 2: 導入一個(gè)文件。我們可以使用"put"命令。
Shell代碼
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從本地文件系統中拷貝到 HDFS的 /user/yourUserName/interestingFile.txt 。
Step 3: 驗證剛才的操作。這里我們有兩個(gè)命令可以使用,它們是等效的:
Shell代碼
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
你應該能夠看見(jiàn)一個(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中沒(méi)有/user/$User/bar這樣的文件存在 將本地文件foo上傳到hdfs系統,并命名為/user/$USER/bar
bin/hadoop dfs -put foo bar /user/$USER/bar 是一個(gè)目錄 將本地文件foo上傳到hdfs系統,并命名為/user/$USER/bar/foo
bin/hadoop dfs -put foo somedir/somefile /user/$USER/somedir 不存在 將本地文件foo上傳到hdfs系統,并命名為 /user/$USER/somedir/somefile, 創(chuàng )建沒(méi)有存在的目錄
bin/hadoop dfs -put foo bar /user/$USER/bar 已經(jīng)是系統中的一個(gè)文件 操作無(wú)效,系統將返回一個(gè)錯誤給用戶(hù)。
當執行一個(gè)"put"操作時(shí),它的結果是要么全做,要么全不做。上傳文件的時(shí)候,文件首先被拷貝到DataNode節點(diǎn)上。當所有的DataNode都接收完數據的時(shí)候,文件句柄被關(guān)閉,這個(gè)文件才真正的上傳完。根據"put"命令的返回值,我們可以知道這個(gè)操作是成功了,還是完全失敗了。文件不可能會(huì )只被上傳一半。如果文件上傳到一半時(shí),上傳操作被中斷了,那么hdfs就會(huì )當作什么事情也沒(méi)有發(fā)生一樣。
Step 4: 一次上傳多個(gè)文件. "put"命令是可以一次上傳多個(gè)命令的,它能夠將一整個(gè)目錄上傳到HDFS中。
創(chuàng )建一個(gè)本地目錄,然后往里面拷一些文件。情況像下面的那樣。
Shell代碼
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中:
Shell代碼
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)來(lái)了。注意文件路徑旁邊的<r 1>,里面的數字1 表示備份的數量是1。同時(shí)ls命令也列出了文件大小,上傳時(shí)間,權限,所有者這些信息。
-put 的另外一種寫(xiě)法是 -copyFromLocal. 它們的功能和用法是一樣的。
從 HDFS中導出數據
從HDFS中導出數據是有許多的方法的,最簡(jiǎn)單的那種應該是使用"cat"將一個(gè)文件的內容輸出到標準輸出上。(當然,它也能夠作為參數傳到程序里面,或者是其他地方)
Step 1: cat 命令.
在這個(gè)例子中,我們假定你已經(jīng)傳了一些文件進(jìn)入你的HDFS中了。
Shell代碼
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中的文件拷貝到本地系統中。
"get"命令有跟"put"命令相反的功能,它能夠將HDFS中文件或目錄拷貝到本地系統中。“get”命令的別名叫做copyToLocal.
Shell代碼
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系統,你可以在NameNode結點(diǎn)執行以下的命令:
Shell代碼
someone@namenode:hadoop$ bin/stop-dfs.sh
someone@namenode:hadoop$ bin/stop-dfs.sh
這個(gè)命令必須由啟動(dòng)HDFS的用戶(hù)來(lái)執行。
HDFS 命令參考
當然 bin/hadoop dfs 的命令遠不只這幾個(gè),不過(guò)這些命令已經(jīng)可以讓你開(kāi)始使用HDFS了。執行沒(méi)有帶參數的bin/hadoop dfs命令,會(huì )列出所有的FsShell system的命令。 bin/hadoop dfs -help commandName 會(huì )列出某一個(gè)具體的命令的用法指南。
所有的命令都作為一個(gè)表格列在下面了,這里是這個(gè)表格的一些注釋?zhuān)?div style="height:15px;">
italics 表示這個(gè)變量是用戶(hù)應該填的。 "path" 一個(gè)文件名,或者目錄名。 "path..." 多個(gè)文件名,或者多個(gè)目錄名。 "file" 任何文件名. "src" and "dest" 路徑名稱(chēng)。 "localSrc" and "localDest" 跟上面的路徑類(lèi)似,只不過(guò)限定在了本地系統中。其他形式的路徑都表示HDFS中的路徑。 在"[]"里面的參數是可選的。
-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.
-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.
-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