Hadoop大象之旅009-通過Shell操作hdfs
老帥
調用Hadoop分布式檔案系統(HDFS)Shell指令應使用bin/hadoop fs <args>的形式。
1.檢視hdfs都有哪些Shell指令
參照前面章節中所述方法,使用SecureCRTPortable.exe登入CentOS;
使用指令“hadoopfs”檢視hdfs的指令清單,如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPnF2bsdVWxgmMjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN5ATO1ETMwETOwITM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
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] <MODE[,MODE]... | OCTALMODE> URI [URI …]
使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
使用方法:hadoop fs -copyFromLocal <localsrc> URI
使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
使用方法:hadoop fs -cp URI [URI …] <dest>
将檔案從源路徑複制到目标路徑。這個指令允許有多個源路徑,此時目标路徑必須是一個目錄。
· 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 <args>
顯示檔案的大小。
使用方法:hadoop fs -expunge
使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>
複制檔案到本地檔案系統。可用-ignorecrc選項複制CRC校驗失敗的檔案。使用-crc選項複制檔案以及CRC資訊。
· hadoop fs -get /user/hadoop/file localfile
· hadoop fs -get hdfs://host:port/user/hadoop/file localfile
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]
接受一個源目錄和一個目标檔案作為輸入,并且将源目錄中所有的檔案連接配接成本地目标檔案。addnl是可選的,用于指定在每個檔案結尾添加一個換行符。
使用方法:hadoop fs -ls <args>
如果是檔案,則按照如下格式傳回檔案資訊:
檔案名 <副本數> 檔案大小修改日期修改時間權限使用者ID 組ID
如果是目錄,則傳回它直接子檔案的一個清單,就像在Unix中一樣。目錄傳回清單的資訊如下:
目錄名 <dir> 修改日期修改時間權限使用者ID 組ID
hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile
使用方法:hadoop fs -lsr <args>
ls指令的遞歸版本。類似于Unix中的ls -R。
使用方法:hadoop fs -mkdir <paths>
接受路徑指定的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 <src> <dst>
輸出一個”not implemented“資訊。
使用方法:hadoop fs -mv URI [URI …] <dest>
将檔案從源路徑移動到目标路徑。這個指令允許有多個源路徑,此時目标路徑必須是一個目錄。不允許在不同的檔案系統間移動檔案。
· 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 <localsrc> ... <dst>
從本地檔案系統中複制單個或多個源路徑到目标檔案系統。也支援從标準輸入中讀取輸入寫入目标檔案系統。
· 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] <path>
改變一個檔案的副本系數。-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 <src>
将源檔案輸出為文本格式。允許的格式是zip和TextRecordInputStream。
使用方法:hadoop fs -touchz URI [URI …]
建立一個0位元組的空檔案。
· hadoop -touchz pathname
2.檢視hdfs根目錄下都有哪些檔案
使用指令“hadoopfs –lsr /”遞歸檢視hdfs根目錄下的所有檔案夾和檔案清單,如下圖所示:
第一個字元:如果實d開頭的表示檔案夾,-開頭的表示檔案
再後面的10個字元是權限控制
再後面表示副本數量,檔案夾用-表示,因為檔案夾沒有副本
再後面的root是建立者
再後面表示該檔案屬于哪個使用者組
再後面的是檔案大小,如果是檔案夾則沒有大小
注意:hdfs管理的檔案,在linux下是看不到的。
3.在hdfs根目錄下建立一個檔案夾
使用指令“hadoopfs –mkdir /test”查建立一個檔案夾,如下圖所示:
4.上傳檔案到hdfs中
我們将linux系統/root目錄下的一個68M的big.bin檔案上傳到hdfs的test檔案夾中;
先看一下linux下的這個檔案,如下圖所示:
執行上傳指令“hadoopfs -put /root/big.bin /test”,并檢視結果如下圖所示:
如果檔案在hdfs中已經存在,會提示錯誤資訊,如下圖所示:
如果實在想上傳,可以改個名字:“hadoopfs -put /root/big.bin /test/big1.bin”
5.預設檔案夾與預設檔案名
在hdfs中所有使用者的預設檔案夾都是/user/<currentUser>/
如我們執行指令“hadoopfs –ls”,出現如下提示:
這是因為目前使用者是root,而在hdfs檔案系統的/user/檔案夾下沒有/user/root/檔案夾
如我們先執行指令“hadoopfs –mkdir /user/root”,然後再執行指令“hadoopfs –ls”,就正常了,如下圖所示:
不過此時/user/root目錄下是空的,是以看不到檔案。
如使用指令“hadoopfs –put little.txt abc”
注意:如果不指定hdfs目錄,則預設為“/user/<currentUser>/”路徑
如果指定的路徑abc檔案夾不存在,那麼abc預設作為檔案名使用,将把little.text上傳到預設路徑下,并且名字為abc
6.通路指定的hdfs伺服器
使用指令“hadoopfs –ls hdfs://hadoop001:9000/”可以通路指定的hdfs檔案系統,如果通路本機,用“/”即可代替根目錄。
使用指令“morecore-site.xml”檢視配置檔案,如下圖所示:
可以看到hdfs的預設名稱設定為“hdfs://hadoop001:9000”
7.區分htfs在linux中的根目錄和hdfs自己的虛拟根目錄
使用指令“cd$HADOOP_HOME”通路htfs在linux上的根目錄
使用指令“hadoopfs –ls /”通路hdfs系統的虛拟根目錄