HDFS Shell命令介紹
HDFS Shell是由一系列類似Linux Shell的操作命令組成。借助這些命令,用戶可以完成HDFS文件的復(fù)制、刪除和查找等操作,也可以完成HDFS與Linux本地文件系統(tǒng)、S3文件系統(tǒng)等的交互。
更多可以參考hadoop官方文檔:http://hadoop.apache.org/docs/
1、HDFS有關(guān)文件操作的Shell命令
一般格式如下:
$ hadoop fs [通用選項]
其中,“hadoop”是Hadoop系統(tǒng)在Linux系統(tǒng)中的主命令,它對應(yīng)的程序文件位于Hadoop安裝目錄的bin子目錄中。“fs”是子命令,表示執(zhí)行文件系統(tǒng)操作。通用選項由HDFS文件操作命令和操作參數(shù)組成,不能省略,必須以英文減號字符“-”打頭。操作對象在操作參數(shù)中指定。
例如,“hadoopfs -ls /”命令表示顯示HDFS文件系統(tǒng)的根目錄信息。在該命令中,“-ls”是HDFS的文件操作命令,功能與Linux系統(tǒng)中的ls命令相似?!?”是操作參數(shù),指定操作對象為HDFS文件系統(tǒng)的根目錄。
2、HDFS Shell幫助
1.顯示所有幫助信息? ? $ hadoop fs –help
2.顯示特定命令的幫助
若要顯示某個特定Shell命令的幫助信息,則可在help命令之后添加該Shell命令。
??? 例如,$ hadoop fs -help ls
3、文件操作命令
在HDFS Shell命令中,有關(guān)文件的操作命令比較豐富,包括目錄或文件的創(chuàng)建、復(fù)制、重命名、顯示、查找、統(tǒng)計等命令。
3.1、 ls和lsr??
一般格式如下:
?hadoop fs -ls
[-d] [-h] [-R] <args>
?其中,各選項說明如下:
????-d選項: 將目錄顯示為普通文件(plain file)
????-h選項: 使用方便人閱讀的信息單位顯示文件大小,例如64.0m 表示67108864字節(jié)
????-R選項: 遞歸顯示所有子目錄的信息
????lsr功能等同于ls -R命令
3.2、mkdir命令
mkdir命令用來在指定的path中新建子目錄。其中,創(chuàng)建位置path可采用URI格式進行指定。該命令功能與Linux系統(tǒng)的mkdir相同,允許一次創(chuàng)建多個子目錄。一般格式如下:
?hadoop fs -mkdir [-p]
<paths>
其中,-p選項表示創(chuàng)建子目錄時先檢查路徑是否存在,若不存在則同時創(chuàng)建相應(yīng)的各級目錄。
例如, hadoop fs -mkdir /test1 /test2
此處,若文件路徑/test1不存在,則可使用??hadoop fs -mkdir -p /test1 /test2
3.3、touchz和appendToFile命令
? touchz命令與Linux的touch命令功能相同,用于創(chuàng)建一個空文件。appendToFile命令用于把一個或多個Linux本地的原文件的內(nèi)容追加到目標文件中。2條命令的格式分別如下:
? hadoop fs -touchz URI[URI……]
? hadoop fs -appendToFile <localsrc>? ?<dst>
其中,<localsrc>為本地源文件,<dst>為HDFS中的目標文件。
例如: hadoop fs -touchz /test1/abc.txt
3.4、cp、mv、rm、rmdir和rmr命令
這4條命令類似Linux系統(tǒng)命令,表示復(fù)制文件、移動文件和刪除文件。
(1) cp命令
?cp命令用于將指定URI的一個或多個源文件復(fù)制到HDFS文件系統(tǒng)中目標位置。該命令一般格式如下:
hadoop fs -cp [-f] [-p | -p[topax]] URI [URI ...]? <dest>
其中,各選項說明如下:
?-f選項:表示如果目標文件存在,則覆蓋它。
?-p選項:表示需要保存文件屬性(包括文件的時間戳、擁有者、許可權(quán)限、ACL等。)
例如,$ hadoop fs -cp file:/home/hadoop/file1? /x
(2)mv命令
?mv命令用于移動指定源文件到目標文件。當源文件和目標文件的路徑相同時,該命令實質(zhì)是重命名文件名。當源文件有多個文件時,目標對象必須是一個目錄。該命令不允許跨越文件系統(tǒng)移動文件。例如,將Linux本地文件移動到HDFS中。
mv命令一般格式如下:
??hadoop fs -mv URI [URI ...] <dest>
例如:$ hadoop fs -mv /x/file1 /x/file1.txt
(3) rm、rmdir和rmr命令
?這3條命令用來刪除指定URI中的文件或目錄。為安全起見,執(zhí)行刪除操作后,被刪除的文件可放入垃圾目錄(trash directory)中。需要注意的是,HDFS默認情況下關(guān)閉了垃圾目錄功能,用戶可以在core-site.xml文件中設(shè)置fs.trash.interval配置項的值為非零值,即可啟用該功能。rm命令的一般格式如下:
??hadoop fs -rm [-f] [-r |-R] [-skipTrash] URI [URI ...]
?其中,各選項說明如下:
?-f選項:表示執(zhí)行刪除操作時不顯示提示信息,包括錯誤提示。
?-R或-r選項:表示刪除目錄,連同內(nèi)部文件或子目錄。
?rmdir和rmr命令用于刪除目錄。其中,rmdir只能刪除空目錄,rmr與rm–r功能相同。
3.5、cat、tail、du、dus、stat和count命令
?(1) cat、tail命令
?cat命令與Linux系統(tǒng)的cat類似,能夠輸出指定文件的全部內(nèi)容;而tail命令只能顯示文件的最后1KB的內(nèi)容。可見,當輸出對象小于1KB時,cat和tail命令效果相同。
例如:
?$ hadoop fs -cat /x/file 1.txt
?$ hadoop fs -cat file:/home/hadoop/file2
(2) du、dus命令
du命令用來顯示文件或目錄占用存儲空間的大小,當目標對象是一個文件時,將輸出該文件的長度。該命令的一般格式如下:
?hadoop fs -du [-s] [-h] URI [URI ...]
?其中,各選項說明如下:
?-s 選項:匯總輸出各目標文件的總長度,而不是單個文件的匯總。
?-h選項:以便于人閱讀的信息單位顯示文件大小,例如MB。
dus命令用來輸出各目標文件的總長度,與du -s功能相同。
例如:$ hadoop fs -du /x/y/test1/abc.txt
(3) stat命令
?stat命令支持以指定輸出格式顯示文件或目錄的統(tǒng)計信息。該命令的一般格式如下:
?hadoop fs -stat [format] <path> ...
其中,[format]是一個輸出格式字符串,可以包含普通字符,也可以包含%打頭的格式字符,例如%b。如果是普通字符,則直接顯示輸出。
例如:$ hadoop fs -stat "%n '%F' %b %o %r %u:%g %y" /x/file1.txt
(4) count命令
count命令用來統(tǒng)計指定路徑的文件數(shù),輸出的主要信息包括:目錄數(shù)(DIR_COUNT)、文件個數(shù)(FILE_COUNT)、內(nèi)容長度(CONTENT_SIZE)以及對象名(FILE_NAME)。該命令支持Linux通配符,例如用星號*來匹配任意不確定的多個字符。該命令的一般格式如下:
?? hadoop fs -count [-h] <paths>
其中,-h選項表示以便于閱讀的信息單位顯示文件大小。
例如:$ hadoop fs -count file:/home/hadoop/hadoop-2*
3.6、 find、checksum和df 命令
?(1) find命令
該命令用來查找與指定表達式匹配的所有文件,以找出想要查找的文件,其一般格式如下:
??hadoop fs -find <path> ... <expression> ...
其中,path為查找目標,省略查找目標時,默認從當前目錄中開始查找;expression為查找表達式,支持Linux系統(tǒng)的通配符,可用-name或-iname選項來定義,表示根據(jù)文件名進行匹配查找。其中,iname選項表示不區(qū)分大小寫(case insensitive)。省略查找表達式時,該命令的功能等效于lsr命令,顯示指定目錄及其子目錄的所有文件列表。
例如:$ hadoopfs -find?/ -name? '*.txt'
(2) checksum命令
??checksum命令用來返回指定文件的校驗碼信息。
例如:$ hadoop fs -checksum /x/file1.txt
(3) df命令
df命令用來顯示指定文件的大小及HDFS系統(tǒng)剩余存儲空間。該命令的一般格式如下:
hadoop fs -df [-h] URI [URI ...]
其中,-h選項使用便于閱讀的方式格式化文件的大小,例如用64.0m來代替67108864。
例如:$ hadoop fs -df /x/file1.txt
4、跨文件系統(tǒng)的交互操作命令
1. put和 copyFromLocal命令
這2條命令都表示上傳文件,即把Linux本地文件系統(tǒng)中的一個或多個文件復(fù)制到HDFS文件系統(tǒng)中。
put命令的一般格式如下: hadoop fs -put <localsrc>? <dst>
例如:$ hadoopfs -put hadoop-2.7.2.tar.gz? /test/
2. get和copyToLocal命令
這2條命令都表示下載文件,即從HDFS文件系統(tǒng)中復(fù)制文件到Linux本地文件系統(tǒng)。
get命令的一般格式如下:
?hadoop fs -get [-ignorecrc] [-crc] <src>? <localdst>
其中,-ignorecrc選項表示忽略CRC檢驗錯誤。
例如:$ hadoopfs -get /x/file1.txt? myfile.txt
3. moveFromLocal和moveToLocal命令
這2條命令提供Linux文件系統(tǒng)和HDFS文件系統(tǒng)之間的“乾坤大挪移”操作,moveFromLocal命令支持從本地將文件移動到HDFS中, moveToLocal命令則相反。
一般格式如下:
?hadoop fs -moveFromLocal <localsrc>? <dst>
?hadoop fs -moveToLocal [-crc] <src>? <dst>
不同于put和get命令,此2條命令操作結(jié)束之后原文件將不復(fù)存在。
5、權(quán)限管理操作
1. chgrp命令
該命令用于修改文件所屬的組。需要注意的是,只有文件的擁有者或超級用戶才能有權(quán)執(zhí)行該命令操作。一般格式如下:
?hadoop fs -chgrp [-R] GROUP URI [URI ...]
其中,-R選項表示涵蓋指定URI的內(nèi)部所有目錄和文件。
例如,執(zhí)行以下操作,修改/test2目錄及內(nèi)部目錄和文件的所屬的用戶組為root組:
? $hadoop fs -chgrp -R root /test2
2. chown命令
該命令用于修改文件的擁有者。需要注意的是,只有超級用戶才能有權(quán)執(zhí)行該命令操作。
一般格式如下:
hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
其中,-R選項的功能與chgrp命令的-R選項相同。
例如,執(zhí)行以下命令,修改/test2/myfile.txt的擁有者為root用戶。
???$hadoop fs -chown root /test2/myfile.txt
3. chmod命令
該命令用來修改文件的操作權(quán)限。需要注意的是,只有文件的擁有者和超級用戶才能有權(quán)執(zhí)行該命令操作。
一般格式如下:
??hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]
其中,-R選項表示把目標URI內(nèi)的所有文件和子目錄的權(quán)限一起修改。

4. setrep命令
該命令用來修改一個文件的副本系數(shù)。如果目標對象是一個目錄,則該命令將修改該目錄及其子目錄中的所有文件的副本系數(shù)。一般格式如下:
??hadoop fs -setrep [-R] [-w] <numReplicas> <path>
?其中,各選項說明如下:
?-w選項:表示請求該命令等待到副本完成之時。這可能需要很長的時間。
?-R選項:用于遞歸改變目錄下所有文件的副本系數(shù)。
例如:$ hadoop fs -setrep 3 /test2/myfile.txt
5. truncate命令
??該命令用于強制截斷文件數(shù)據(jù)為指定長度的數(shù)據(jù)塊,也就是要求HDFS系統(tǒng)不采用默認長度(如128MB)而按指定長度值把文件數(shù)據(jù)內(nèi)容重新切分。
一般格式如下:
?hadoop fs -truncate [-w] <length> <paths>
?其中,-w選項表示請求該命令等待到數(shù)據(jù)塊截斷完成之時。省略-w選項,由于truncate命令通常會在目標文件實際切分操作結(jié)束之前提前結(jié)束,顯然目標文件將仍然處于未關(guān)閉狀態(tài),因此此時不能立即重新打開,進行追加數(shù)據(jù)操作。
例如,執(zhí)行以下命令,把myfile.txt文件按10字節(jié)長度進行截斷:
???$hadoop fs -truncate 10 /test2/myfile.txt