天天看點

HDFS指令行接口

現在我們通過指令行互動來進一步認識HDFS。HDFS還有很多其他接口,但指令行是最簡單的,同時也是許多開發者最熟悉的。

參照附錄A中僞分布模式下設定Hadoop的說明,我們先在一台機器上運作HDFS。稍後介紹如何在叢集上運作HDFS,以提供伸縮性與容錯性。

在我們設定僞分布配置時,有兩個屬性項需要進一步解釋。第一項是fs.default.name,設定為hdfs://localhost/,用于設定Hadoop的預設檔案系統。檔案系統是由URI指定的,這裡我們已使用hdfs URI來配置HDFS為Hadoop的預設檔案系統。HDFS的守護程式通過該屬性項來确定HDFS namenode的主機及端口。我們将在localhost預設端口8020上運作namenode。這樣一來,HDFS用戶端可以通過該屬性得知namenode在哪裡運作進而連接配接到它。

第二個屬性dfs.replication,我們設為1,這樣一來,HDFS就不會按預設設定将檔案系統塊複本設為3。在單獨一個datanode上運作時,HDFS無法将塊複制到3個datanode上,是以會持續給出塊複本不足的警告。設定這個屬性之後,就不會再有問題了。

檔案系統的基本操作

至此,檔案系統已經可以使用了,我們可以執行所有常用的檔案系統操作,例如,讀取檔案,建立目錄,移動檔案,删除資料,列出目錄,等等。可以輸入hadoop fs -help指令擷取每個指令的詳細幫助檔案。

首先從本地檔案系統将一個檔案複制到HDFS:

  1. % hadoop fs -copyFromLocal input/docs/quangle.txt hdfs://localhost/user/tom/quangle.txt 

該指令調用Hadoop檔案系統的shell指令fs,後者提供了一系列子指令,在這個例子中,我們執行的是-copyFromLocal。本地檔案quangle.txt被複制到運作在localhost上的 HDFS執行個體中,路徑為/user/tom/quangle.txt。事實上,我們可以簡化指令格式以省略主機的URI并使用預設設定,即省略hdfs://localhost,因為該項已在core-site.xml中指定。

  1. % hadoop fs -copyFromLocal input/docs/quangle.txt /user/tom/quangle.txt 

我們也可以使用相對路徑,并将檔案複制到HDFS的home目錄中,本例中為/user/tom:

  1. % hadoop fs -copyFromLocal input/docs/quangle.txt quangle.txt 

我們把檔案複制回本地檔案系統,并檢查是否一緻:

  1. % hadoop fs -copyToLocal quangle.txt quangle.copy.txt  
  2. % md5 input/docs/quangle.txt quangle.copy.txt  
  3.  MD5 (input/docs/quangle.txt) = a16f231da6b05e2ba7a339320e7dacd9  
  4.  MD5 (quangle.copy.txt) = a16f231da6b05e2ba7a339320e7dacd9 

MD5鍵值相同,表明這個檔案在HDFS之旅中得以幸存并儲存完整。

最後,我們看一下HDFS檔案清單。我們建立一個目錄看它在清單中是怎麼顯示的:

  1. % hadoop fs -mkdir books  
  2. % hadoop fs -ls .  
  3. Found 2 items  
  4. drwxr-xr-x   - tom supergroup   0 2009-04-02 22:41 /user/tom/books  
  5. -rw-r--r--   1 tom supergroup   118 2009-04-02 22:29 /user/tom/quangle.txt 

傳回的結果資訊與Unix指令ls -l的輸出結果非常相似,僅有細微差别。第1列顯示的是檔案模式。第2列是這個檔案的備份數(這在傳統Unix檔案系統是沒有的)。由于我們在整個檔案系統範圍内設定的預設複本數為1,是以這裡顯示的也都是1。這一列的開頭目錄為空,因為本例中沒有使用複本的概念——目錄作為中繼資料儲存在namenode中,而非datanode中。第3列和第4列顯示檔案的所屬使用者群組别。第5列是檔案的大小,以位元組為機關,目錄為0。第6列和第7列是檔案的最後修改日期與時間。最後,第8列是檔案或目錄的絕對路徑。

HDFS中的檔案通路權限

針對檔案和目錄,HDFS的權限模式與POSIX 非常相似。

一共提供三類權限模式:隻讀權限(r)、寫入權限(w)和可執行權限(x)。讀取檔案或列出目錄内容時需要隻讀權限。寫入一個檔案或是在一個目錄上建立及删除檔案或目錄,需要寫入權限。對于檔案而言,可執行權限可以忽略,因為你不能在HDFS中執行檔案(與POSIX不同),但在通路一個目錄的子項時需要該權限。

每個檔案和目錄都有所屬使用者(owner)、所屬組别(group)及模式(mode)。這個模式是由所屬使用者的權限、組内成員的權限及其他使用者的權限組成的。

在預設情況下,可以通過正在運作程序的使用者名群組名來唯一确定用戶端的辨別。但由于用戶端是遠端的,任何使用者都可以簡單地在遠端系統上以其名義建立一個賬戶來進行通路。是以,作為共享檔案系統資源和防止資料意外損失的一種機制,權限隻能供合作團體中的使用者使用,而不能用于在一個不友好的環境中保護資源。注意,最新版的Hadoop已經支援Kerberos使用者認證,該認證去除了這些限制,詳見第325頁的“安全”小節。但是,除了上述限制之外,為防止使用者或自動工具及程式意外修改或删除檔案系統的重要部分,啟用權限控制還是很重要的(這也是預設的配置,參見dfs.permissions屬性)。

如果啟用權限檢查,就會檢查所屬使用者權限,以确認用戶端的使用者名與所屬使用者是否比對,另外也将檢查所屬組别權限,以确認該用戶端是否是該使用者組的成員;若不符,則檢查其他權限。

這裡有一個超級使用者(super-user)的概念,超級使用者是namenode程序的辨別。對于超級使用者,系統不會執行任何權限檢查。

繼續閱讀