天天看點

Hadoop大象之旅009-通過Shell操作hdfs

Hadoop大象之旅009-通過Shell操作hdfs

                                                               老帥

調用Hadoop分布式檔案系統(HDFS)Shell指令應使用bin/hadoop fs <args>的形式。

1.檢視hdfs都有哪些Shell指令

參照前面章節中所述方法,使用SecureCRTPortable.exe登入CentOS;

使用指令“hadoopfs”檢視hdfs的指令清單,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

hdfs的所有指令的格式,都為:hadoop fs –xx,具體使用方法,可參考官方文檔:

<a target="_blank" href="http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html">http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html</a>

全部指令清單如下

使用方法:hadoop fs -cat URI [URI …]

将路徑指定檔案的内容輸出到stdout。

示例:

·         hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2

·         hadoop fs -cat file:///file3 /user/hadoop/file4

傳回值:

成功傳回0,失敗傳回-1。

使用方法:hadoop fs -chmod [-R] &lt;MODE[,MODE]... | OCTALMODE&gt; URI [URI …]

使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]

使用方法:hadoop fs -copyFromLocal &lt;localsrc&gt; URI

使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI &lt;localdst&gt;

使用方法:hadoop fs -cp URI [URI …] &lt;dest&gt;

将檔案從源路徑複制到目标路徑。這個指令允許有多個源路徑,此時目标路徑必須是一個目錄。 

·         hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2

·         hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir

使用方法:hadoop fs -du URI [URI …]

顯示目錄中所有檔案的大小,或者當隻指定一個檔案時,顯示此檔案的大小。

hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1 

成功傳回0,失敗傳回-1。 

使用方法:hadoop fs -dus &lt;args&gt;

顯示檔案的大小。

使用方法:hadoop fs -expunge

使用方法:hadoop fs -get [-ignorecrc] [-crc] &lt;src&gt; &lt;localdst&gt; 

複制檔案到本地檔案系統。可用-ignorecrc選項複制CRC校驗失敗的檔案。使用-crc選項複制檔案以及CRC資訊。

·         hadoop fs -get /user/hadoop/file localfile

·         hadoop fs -get hdfs://host:port/user/hadoop/file localfile

使用方法:hadoop fs -getmerge &lt;src&gt; &lt;localdst&gt; [addnl]

接受一個源目錄和一個目标檔案作為輸入,并且将源目錄中所有的檔案連接配接成本地目标檔案。addnl是可選的,用于指定在每個檔案結尾添加一個換行符。

使用方法:hadoop fs -ls &lt;args&gt;

如果是檔案,則按照如下格式傳回檔案資訊:

檔案名 &lt;副本數&gt; 檔案大小修改日期修改時間權限使用者ID 組ID 

如果是目錄,則傳回它直接子檔案的一個清單,就像在Unix中一樣。目錄傳回清單的資訊如下:

目錄名 &lt;dir&gt; 修改日期修改時間權限使用者ID 組ID 

hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile 

使用方法:hadoop fs -lsr &lt;args&gt; 

ls指令的遞歸版本。類似于Unix中的ls -R。

使用方法:hadoop fs -mkdir &lt;paths&gt; 

接受路徑指定的uri作為參數,建立這些目錄。其行為類似于Unix的mkdir -p,它會建立路徑中的各級父目錄。

·         hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2

·         hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir

使用方法:dfs -moveFromLocal &lt;src&gt; &lt;dst&gt;

輸出一個”not implemented“資訊。

使用方法:hadoop fs -mv URI [URI …] &lt;dest&gt;

将檔案從源路徑移動到目标路徑。這個指令允許有多個源路徑,此時目标路徑必須是一個目錄。不允許在不同的檔案系統間移動檔案。 

·         hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2

·         hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1

使用方法:hadoop fs -put &lt;localsrc&gt; ... &lt;dst&gt;

從本地檔案系統中複制單個或多個源路徑到目标檔案系統。也支援從标準輸入中讀取輸入寫入目标檔案系統。

·         hadoop fs -put localfile /user/hadoop/hadoopfile

·         hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir

·         hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile

·         hadoop fs -put - hdfs://host:port/hadoop/hadoopfile 

從标準輸入中讀取輸入。

使用方法:hadoop fs -rm URI [URI …]

删除指定的檔案。隻删除非空目錄和檔案。請參考rmr指令了解遞歸删除。

·         hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir

使用方法:hadoop fs -rmr URI [URI …]

delete的遞歸版本。

·         hadoop fs -rmr /user/hadoop/dir

·         hadoop fs -rmr hdfs://host:port/user/hadoop/dir

使用方法:hadoop fs -setrep [-R] &lt;path&gt;

改變一個檔案的副本系數。-R選項用于遞歸改變目錄下所有檔案的副本系數。

·         hadoop fs -setrep -w 3 -R /user/hadoop/dir1

使用方法:hadoop fs -stat URI [URI …]

傳回指定路徑的統計資訊。

·         hadoop fs -stat path

使用方法:hadoop fs -tail [-f] URI

将檔案尾部1K位元組的内容輸出到stdout。支援-f選項,行為和Unix中一緻。

·         hadoop fs -tail pathname

使用方法:hadoop fs -test -[ezd] URI

選項:

-e 檢查檔案是否存在。如果存在則傳回0。

-z 檢查檔案是否是0位元組。如果是則傳回0。 

-d 如果路徑是個目錄,則傳回1,否則傳回0。

·         hadoop fs -test -e filename

使用方法:hadoop fs -text &lt;src&gt; 

将源檔案輸出為文本格式。允許的格式是zip和TextRecordInputStream。

使用方法:hadoop fs -touchz URI [URI …] 

建立一個0位元組的空檔案。

·         hadoop -touchz pathname

2.檢視hdfs根目錄下都有哪些檔案

使用指令“hadoopfs –lsr /”遞歸檢視hdfs根目錄下的所有檔案夾和檔案清單,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

第一個字元:如果實d開頭的表示檔案夾,-開頭的表示檔案

再後面的10個字元是權限控制

再後面表示副本數量,檔案夾用-表示,因為檔案夾沒有副本

再後面的root是建立者

再後面表示該檔案屬于哪個使用者組

再後面的是檔案大小,如果是檔案夾則沒有大小

注意:hdfs管理的檔案,在linux下是看不到的。

3.在hdfs根目錄下建立一個檔案夾

使用指令“hadoopfs –mkdir /test”查建立一個檔案夾,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

4.上傳檔案到hdfs中

我們将linux系統/root目錄下的一個68M的big.bin檔案上傳到hdfs的test檔案夾中;

先看一下linux下的這個檔案,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

執行上傳指令“hadoopfs -put /root/big.bin /test”,并檢視結果如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

如果檔案在hdfs中已經存在,會提示錯誤資訊,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

如果實在想上傳,可以改個名字:“hadoopfs -put /root/big.bin /test/big1.bin”

5.預設檔案夾與預設檔案名

在hdfs中所有使用者的預設檔案夾都是/user/&lt;currentUser&gt;/

如我們執行指令“hadoopfs –ls”,出現如下提示:

Hadoop大象之旅009-通過Shell操作hdfs

這是因為目前使用者是root,而在hdfs檔案系統的/user/檔案夾下沒有/user/root/檔案夾

如我們先執行指令“hadoopfs –mkdir /user/root”,然後再執行指令“hadoopfs –ls”,就正常了,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

不過此時/user/root目錄下是空的,是以看不到檔案。

如使用指令“hadoopfs –put little.txt abc”

Hadoop大象之旅009-通過Shell操作hdfs

注意:如果不指定hdfs目錄,則預設為“/user/&lt;currentUser&gt;/”路徑

      如果指定的路徑abc檔案夾不存在,那麼abc預設作為檔案名使用,将把little.text上傳到預設路徑下,并且名字為abc

6.通路指定的hdfs伺服器

使用指令“hadoopfs –ls hdfs://hadoop001:9000/”可以通路指定的hdfs檔案系統,如果通路本機,用“/”即可代替根目錄。

Hadoop大象之旅009-通過Shell操作hdfs

使用指令“morecore-site.xml”檢視配置檔案,如下圖所示:

Hadoop大象之旅009-通過Shell操作hdfs

可以看到hdfs的預設名稱設定為“hdfs://hadoop001:9000”

7.區分htfs在linux中的根目錄和hdfs自己的虛拟根目錄

使用指令“cd$HADOOP_HOME”通路htfs在linux上的根目錄

Hadoop大象之旅009-通過Shell操作hdfs

使用指令“hadoopfs –ls /”通路hdfs系統的虛拟根目錄

繼續閱讀