概觀

檔案系統 (FS) shell 包含各種類似 shell 的指令,可直接與 Hadoop 分散式檔案系統 (HDFS) 及 Hadoop 支援的其他檔案系統互動,例如 Local FS、WebHDFS、S3 FS 等。FS shell 可透過以下方式呼叫

bin/hadoop fs <args>

所有 FS shell 指令將路徑 URI 作為引數。URI 格式為 scheme://authority/path。對於 HDFS,其 scheme 為 hdfs,而對於 Local FS,其 scheme 為 file。scheme 和 authority 是選用的。如果未指定,則使用設定檔中指定的預設 scheme。HDFS 檔案或目錄(例如 /parent/child)可以指定為 hdfs://namenodehost/parent/child 或僅指定為 /parent/child(假設您的設定已設定為指向 hdfs://namenodehost)。

FS shell 中的大部分指令都像對應的 Unix 指令一樣運作。差異會在各個指令中說明。錯誤資訊會傳送至 stderr,而輸出會傳送至 stdout。

如果使用 HDFS,hdfs dfs 為同義詞。

可以使用相對路徑。對於 HDFS,目前的工作目錄為 HDFS 家目錄 /user/<username>,通常必須手動建立。也可以隱含存取 HDFS 家目錄,例如,使用 HDFS 垃圾桶資料夾時,家目錄中的 .Trash 目錄。

請參閱 指令手冊,以取得一般 shell 選項。

appendToFile

用法:hadoop fs -appendToFile <localsrc> ... <dst>

將單一 src 或多個 src 從本機檔案系統附加到目的地檔案系統。也會從 stdin 讀取輸入,並附加到目的地檔案系統。

  • hadoop fs -appendToFile localfile /user/hadoop/hadoopfile
  • hadoop fs -appendToFile localfile1 localfile2 /user/hadoop/hadoopfile
  • hadoop fs -appendToFile localfile hdfs://nn.example.com/hadoop/hadoopfile
  • hadoop fs -appendToFile - hdfs://nn.example.com/hadoop/hadoopfile 從 stdin 讀取輸入。

結束代碼

成功時傳回 0,錯誤時傳回 1。

cat

用法:hadoop fs -cat [-ignoreCrc] URI [URI ...]

將來源路徑複製到 stdout。

選項

  • -ignoreCrc 選項會停用檢查和驗證。

範例

  • hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
  • hadoop fs -cat file:///file3 /user/hadoop/file4

結束代碼

成功時傳回 0,錯誤時傳回 -1。

檢查碼

用法:hadoop fs -checksum [-v] URI

傳回檔案的檢查碼資訊。

選項

  • -v 選項會顯示檔案的區塊大小。

範例

  • hadoop fs -checksum hdfs://nn1.example.com/file1
  • hadoop fs -checksum file:///etc/hosts

chgrp

用法:hadoop fs -chgrp [-R] GROUP URI [URI ...]

變更檔案的群組關聯。使用者必須是檔案的所有者,否則必須是超級使用者。其他資訊請參閱 權限指南

選項

  • -R 選項會在目錄結構中遞迴變更。

chmod

用法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]

變更檔案的權限。使用 -R 時,會在目錄結構中遞迴變更。使用者必須是檔案的所有者,否則必須是超級使用者。其他資訊請參閱 權限指南

選項

  • -R 選項會在目錄結構中遞迴變更。

chown

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

變更檔案的所有者。使用者必須是超級使用者。其他資訊請參閱 權限指南

選項

  • -R 選項會在目錄結構中遞迴變更。

copyFromLocal

-put 指令相同。

copyToLocal

-get 指令相同。

count

用法:hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] [-s] <paths>

計算符合指定檔案模式的路徑下目錄、檔案和位元組的數量。取得配額和使用量。使用 -count 的輸出欄位為:DIR_COUNT、FILE_COUNT、CONTENT_SIZE、PATHNAME

-u-q 選項控制輸出的欄位。-q 表示顯示配額,-u 限制輸出僅顯示配額和使用量。

使用 -count -q 的輸出欄位為:QUOTA、REMAINING_QUOTA、SPACE_QUOTA、REMAINING_SPACE_QUOTA、DIR_COUNT、FILE_COUNT、CONTENT_SIZE、PATHNAME

使用 -count -u 的輸出欄位為:QUOTA、REMAINING_QUOTA、SPACE_QUOTA、REMAINING_SPACE_QUOTA、PATHNAME

-t 選項會顯示每個儲存類型的配額和使用量。如果未提供 -u-q 選項,則會略過 -t 選項。-t 選項中可使用的可能參數清單(不區分大小寫,但參數 "" 除外):""、"all"、"ram_disk"、"ssd"、"disk" 或 "archive"。

-h 選項會以人類可讀的格式顯示大小。

-v 選項會顯示標題列。

-x 選項會從結果計算中排除快照。若未提供 -x 選項(預設),結果會永遠從所有 INode 計算,包括指定路徑下的所有快照。如果提供 -u-q 選項,則會略過 -x 選項。

-e 選項會顯示每個檔案的刪除編碼政策。

使用 -count -e 的輸出欄位為:DIR_COUNT、FILE_COUNT、CONTENT_SIZE、ERASURECODING_POLICY、PATHNAME

ERASEURECODING_POLICY 是檔案的政策名稱。如果檔案設定了 erasure 編碼政策,它將傳回政策名稱。如果未設定 erasure 編碼政策,它將傳回「Replicated」,表示使用複製儲存策略。

-s 選項會顯示每個目錄的快照數量。

範例

  • hadoop fs -count hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
  • hadoop fs -count -q hdfs://nn1.example.com/file1
  • hadoop fs -count -q -h hdfs://nn1.example.com/file1
  • hadoop fs -count -q -h -v hdfs://nn1.example.com/file1
  • hadoop fs -count -u hdfs://nn1.example.com/file1
  • hadoop fs -count -u -h hdfs://nn1.example.com/file1
  • hadoop fs -count -u -h -v hdfs://nn1.example.com/file1
  • hadoop fs -count -e hdfs://nn1.example.com/file1
  • hadoop fs -count -s hdfs://nn1.example.com/file1

結束代碼

成功時傳回 0,錯誤時傳回 -1。

cp

用法:hadoop fs -cp [-f] [-p | -p[topax]] [-t <thread count>] [-q <thread pool queue size>] URI [URI ...] <dest>

將檔案從來源複製到目的地。此指令允許多個來源,在這種情況下,目的地必須是目錄。

如果 (1) 來源和目的地檔案系統支援「raw.*」命名空間延伸屬性 (僅限 HDFS),以及 (2) 所有來源和目的地路徑名稱都在 /.reserved/raw 層級中,則會保留「raw.*」命名空間延伸屬性。是否保留 raw.* 命名空間 xattr 的判定與 -p (保留) 旗標無關。

選項

  • -f:如果目的地已存在,則覆寫它。
  • -d:略過建立具有字尾 ._COPYING_ 的暫時檔案。
  • -p:保留檔案屬性 [topx](時間戳記、擁有權、權限、ACL、XAttr)。如果指定 -p 但沒有 arg,則保留時間戳記、擁有權、權限。如果指定 -pa,則保留權限,因為 ACL 是權限的超集。是否保留 raw 命名空間延伸屬性與 -p 旗標無關。
  • -t <thread count>:要使用的執行緒數目,預設為 1。在複製包含多個檔案的目錄時很有用。
  • -q <thread pool queue size>:要使用的執行緒池佇列大小,預設為 1024。僅在執行緒數目大於 1 時才會生效。

範例

  • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
  • hadoop fs -cp -t 5 /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
  • hadoop fs -cp -t 10 -q 2048 /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir

結束代碼

成功時傳回 0,錯誤時傳回 -1。

建立快照

請參閱 HDFS 快照指南

刪除快照

請參閱 HDFS 快照指南

df

用法:hadoop fs -df [-h] URI [URI ...]

顯示可用空間。

選項

  • -h 選項會以「人類可讀」的方式格式化檔案大小(例如 64.0m 取代 67108864)

範例

  • hadoop dfs -df /user/hadoop/dir1

du

用法:hadoop fs -du [-s] [-h] [-v] [-x] URI [URI ...]

顯示指定目錄中所含檔案和目錄的大小,或如果只是一個檔案,則顯示檔案長度。

選項

  • -s 選項會顯示檔案長度的總計摘要,而不是個別檔案。如果不使用 -s 選項,則會從指定的路徑深入 1 層來進行計算。
  • -h 選項會以「人類可讀」的方式格式化檔案大小(例如 64.0m 取代 67108864)
  • -v 選項會顯示欄位名稱作為標題列。
  • -x 選項會從結果計算中排除快照。如果不使用 -x 選項(預設),則結果會永遠從所有 INode 計算,包括指定的路徑下所有快照。

du 會傳回三欄,格式如下

size disk_space_consumed_with_all_replicas full_path_name

範例

  • hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://nn.example.com/user/hadoop/dir1

結束代碼:成功傳回 0,錯誤傳回 -1。

dus

用法:hadoop fs -dus <args>

顯示檔案長度的摘要。

注意:此命令已棄用。請改用 hadoop fs -du -s

expunge

用法:hadoop fs -expunge [-immediate] [-fs <path>]

永久刪除垃圾目錄中保留時間門檻較舊的檢查點中的檔案,並建立新的檢查點。

建立檢查點時,垃圾目錄中最近刪除的檔案會移到檢查點之下。舊於 fs.trash.interval 的檢查點中的檔案會在下次呼叫 -expunge 命令時永久刪除。

如果檔案系統支援此功能,使用者可以設定定期建立和刪除檢查點,方法是儲存在 fs.trash.checkpoint.interval(在 core-site.xml 中)中的參數。此值應小於或等於 fs.trash.interval

如果傳遞了 -immediate 選項,則會立即刪除垃圾目錄中目前使用者的所有檔案,忽略 fs.trash.interval 設定。

如果傳遞了 -fs 選項,則會清除提供的檔案系統,而不是預設檔案系統,並建立檢查點。

例如

hadoop fs -expunge --immediate -fs s3a://landsat-pds/

請參閱 HDFS 架構指南,以取得有關 HDFS 垃圾桶功能的更多資訊。

尋找

用法:hadoop fs -find <路徑> ... <表達式> ...

尋找與指定表達式相符的所有檔案,並對其套用所選動作。如果未指定任何路徑,則預設為目前的作業目錄。如果未指定任何表達式,則預設為 -print。

識別下列主要表達式

  • -name 模式
    -iname 模式

    如果檔案的基本名稱與模式相符(使用標準檔案系統萬用字元),則評估為 true。如果使用 -iname,則比對時不區分大小寫。

  • -print
    -print0

    總是評估為 true。導致將目前的絕對路徑寫入標準輸出。如果使用 -print0 表達式,則會附加一個 ASCII NULL 字元。

識別下列運算子

  • 表達式 -a 表達式
    表達式 -and 表達式
    表達式 表達式

    用於結合兩個表達式的邏輯 AND 運算子。如果兩個子表達式都傳回 true,則傳回 true。由兩個表達式的並置暗示,因此不需要明確指定。如果第一個表達式失敗,則不會套用第二個表達式。

範例

hadoop fs -find / -name test -print

結束代碼

成功時傳回 0,錯誤時傳回 -1。

取得

用法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] [-t <執行緒數量>] [-q <執行緒池佇列大小>] <來源> ... <本機目的地>

將檔案複製到本機檔案系統。使用 -ignorecrc 選項可以複製 CRC 檢查失敗的檔案。使用 -crc 選項可以複製檔案和 CRC。

選項

  • -p:保留存取和修改時間、擁有者和權限。(假設權限可以在檔案系統間傳播)
  • -f:如果目的地已存在,則覆寫目的地。
  • -ignorecrc:略過已下載檔案的 CRC 檢查。
  • -crc:為已下載的檔案寫入 CRC 校驗和。
  • -t <執行緒數量>:要使用的執行緒數量,預設為 1。在下載包含多個檔案的目錄時很有用。
  • -q <thread pool queue size>:要使用的執行緒池佇列大小,預設為 1024。僅在執行緒數目大於 1 時才會生效。

範例

  • hadoop fs -get /user/hadoop/file localfile
  • hadoop fs -get hdfs://nn.example.com/user/hadoop/file localfile
  • hadoop fs -get -t 10 hdfs://nn.example.com/user/hadoop/dir1 localdir
  • hadoop fs -get -t 10 -q 2048 hdfs://nn.example.com/user/hadoop/dir* localdir

結束代碼

成功時傳回 0,錯誤時傳回 -1。

取得 ACL

用法:hadoop fs -getfacl [-R] <路徑>

顯示檔案和目錄的存取控制清單 (ACL)。如果目錄有預設 ACL,則 getfacl 也會顯示預設 ACL。

選項

  • -R:遞迴列出所有檔案和目錄的 ACL。
  • 路徑:要列出的檔案或目錄。

範例

  • hadoop fs -getfacl /file
  • hadoop fs -getfacl -R /dir

結束代碼

成功時傳回 0,錯誤時傳回非 0 值。

getfattr

用法:hadoop fs -getfattr [-R] -n 名稱 | -d [-e 編碼] <路徑>

顯示檔案或目錄的延伸屬性名稱和值(如果有)。

選項

  • -R:遞迴列出所有檔案和目錄的屬性。
  • -n 名稱:傾印指定的延伸屬性值。
  • -d:傾印與路徑名稱相關聯的所有延伸屬性值。
  • -e 編碼:擷取值後對其編碼。有效的編碼為「文字」、「十六進位」和「base64」。以文字字串編碼的值會以雙引號 (") 括住,而以十六進位和 base64 編碼的值則分別以 0x 和 0s 為字首。
  • 路徑:檔案或目錄。

範例

  • hadoop fs -getfattr -d /file
  • hadoop fs -getfattr -R -n user.myAttr /dir

結束代碼

成功時傳回 0,錯誤時傳回非 0 值。

getmerge

用法:hadoop fs -getmerge [-nl] <來源> <本機目的地>

將來源目錄和目的地檔案作為輸入,並將 src 中的檔案串接至目的地本機檔案。也可以設定 -nl 來在每個檔案的結尾新增換行字元 (LF)。-skip-empty-file 可用於避免在檔案為空時出現不需要的換行字元。

範例

  • hadoop fs -getmerge -nl /src /opt/output.txt
  • hadoop fs -getmerge -nl /src/file1.txt /src/file2.txt /output.txt

結束代碼

成功時傳回 0,錯誤時傳回非 0 值。

head

用法:hadoop fs -head URI

將檔案的第一個千位元組顯示至標準輸出。

範例

  • hadoop fs -head 路徑名稱

結束代碼:成功傳回 0,錯誤傳回 -1。

help

用法:hadoop fs -help

傳回用法輸出。

ls

用法:hadoop fs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] <引數>

選項

  • -C:僅顯示檔案和目錄的路徑。
  • -d:將目錄列為一般檔案。
  • -h:以人類可讀的方式格式化檔案大小(例如 64.0m,而非 67108864)。
  • -q:列印 ?,而非不可列印字元。
  • -R:遞迴列出遇到的子目錄。
  • -t:依修改時間排序輸出(最近的優先)。
  • -S:依檔案大小排序輸出。
  • -r:反轉排序順序。
  • -u:使用存取時間,而非修改時間來顯示和排序。
  • -e:僅顯示檔案和目錄的刪除編碼政策。

對於檔案,ls 會傳回檔案的 stat,格式如下

permissions number_of_replicas userid groupid filesize modification_date modification_time filename

對於目錄,它會傳回其直接子目錄的清單,如同 Unix。目錄會列為

permissions userid groupid modification_date modification_time dirname

目錄中的檔案預設會依檔名排序。

範例

  • hadoop fs -ls /user/hadoop/file1
  • hadoop fs -ls -e /ecdir

結束代碼

成功時傳回 0,錯誤時傳回 -1。

lsr

用法:hadoop fs -lsr <args>

ls 的遞迴版本。

注意:此命令已棄用。請改用 hadoop fs -ls -R

mkdir

用法:hadoop fs -mkdir [-p] <paths>

將路徑 URI 作為引數並建立目錄。

選項

  • -p 選項的行為很像 Unix mkdir -p,會沿著路徑建立父目錄。

範例

  • hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
  • hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir

結束代碼

成功時傳回 0,錯誤時傳回 -1。

moveFromLocal

用法:hadoop fs -moveFromLocal <localsrc> <dst>

與 put 指令類似,但會在複製後刪除來源 localsrc。

moveToLocal

用法:hadoop fs -moveToLocal [-crc] <src> <dst>

顯示「尚未實作」訊息。

mv

用法:hadoop fs -mv URI [URI ...] <dest>

將檔案從來源移至目的地。此指令也允許多個來源,此情況下目的地必須是目錄。不允許跨檔案系統移動檔案。

範例

  • hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -mv hdfs://nn.example.com/file1 hdfs://nn.example.com/file2 hdfs://nn.example.com/file3 hdfs://nn.example.com/dir1

結束代碼

成功時傳回 0,錯誤時傳回 -1。

put

用法:hadoop fs -put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] [ - | <localsrc> ...] <dst>

從本機檔案系統複製單一來源或多個來源至目的地檔案系統。如果來源設為「-」,也會從標準輸入讀取並寫入目的地檔案系統。

如果檔案已存在,複製會失敗,除非有指定 -f 旗標。

選項

  • -p:保留存取和修改時間、擁有者和權限。(假設權限可以在檔案系統間傳播)
  • -f:如果目的地已存在,則覆寫目的地。
  • -l:允許 DataNode 將檔案延遲持久化到磁碟,強制複製係數為 1。此旗標會降低耐用性。請小心使用。
  • -d:略過建立具有字尾 ._COPYING_ 的暫時檔案。
  • -t <thread count>:要使用的執行緒數目,預設為 1。在上傳包含多個檔案的目錄時很有用。
  • -q <thread pool queue size>:要使用的執行緒池佇列大小,預設為 1024。僅在執行緒數目大於 1 時才會生效。

範例

  • hadoop fs -put localfile /user/hadoop/hadoopfile
  • hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir
  • hadoop fs -put -d localfile hdfs://nn.example.com/hadoop/hadoopfile
  • hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile 從標準輸入讀取輸入。
  • hadoop fs -put -t 5 localdir hdfs://nn.example.com/hadoop/hadoopdir
  • hadoop fs -put -t 10 -q 2048 localdir1 localdir2 hdfs://nn.example.com/hadoop/hadoopdir

結束代碼

成功時傳回 0,錯誤時傳回 -1。

renameSnapshot

請參閱 HDFS 快照指南

rm

用法:hadoop fs -rm [-f] [-r |-R] [-skipTrash] [-safely] URI [URI ...]

刪除指定為參數的文件。

如果已啟用資源回收筒,檔案系統會將已刪除的文件移至資源回收筒目錄(由 FileSystem#getTrashRoot 提供)。

目前,資源回收筒功能預設為停用。使用者可以設定參數 fs.trash.interval(在 core-site.xml 中)為大於 0 的值來啟用資源回收筒。

請參閱 expunge 以了解資源回收筒中文件的刪除方式。

選項

  • 如果文件不存在,-f 選項不會顯示診斷訊息或修改退出狀態以反映錯誤。
  • -R 選項會遞迴刪除目錄及其下的所有內容。
  • -r 選項等同於 -R。
  • 如果已啟用資源回收筒,-skipTrash 選項會略過資源回收筒並立即刪除指定的文件。當需要從超過配額的目錄中刪除文件時,這項功能會很有用。
  • -safely 選項在刪除檔案總數大於 hadoop.shell.delete.limit.num.files(在 core-site.xml 中,預設值:100)的目錄之前,會要求安全性確認。它可以與 -skipTrash 搭配使用,以防止意外刪除大型目錄。在遞迴遍歷大型目錄以計算要刪除的文件數量之前,預期會出現延遲。

範例

  • hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir

結束代碼

成功時傳回 0,錯誤時傳回 -1。

rmdir

用法:hadoop fs -rmdir [--ignore-fail-on-non-empty] URI [URI ...]

刪除目錄。

選項

  • --ignore-fail-on-non-empty:使用萬用字元時,如果目錄仍包含檔案,則不失敗。

範例

  • hadoop fs -rmdir /user/hadoop/emptydir

rmr

用法:hadoop fs -rmr [-skipTrash] URI [URI ...]

刪除的遞迴版本。

注意:此命令已過時。請改用 hadoop fs -rm -r

setfacl

用法:hadoop fs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>]

設定檔案和目錄的存取控制清單 (ACL)。

選項

  • -b:移除所有項目,但保留基本 ACL 項目。使用者、群組和其他人項目的保留是為了與權限位元組相容。
  • -k:移除預設 ACL。
  • -R:遞迴套用作業至所有檔案和目錄。
  • -m:修改 ACL。新的項目會新增至 ACL,而現有的項目會保留。
  • -x:移除指定的 ACL 項目。其他 ACL 項目會保留。
  • --set:完全取代 ACL,捨棄所有現有項目。acl_spec 必須包含使用者、群組和其他人項目的項目,以與權限位元組相容。如果 ACL 規格只包含存取項目,則會保留現有的預設項目。如果 ACL 規格只包含預設項目,則會保留現有的存取項目。如果 ACL 規格同時包含存取和預設項目,則兩者都會被取代。
  • acl_spec:ACL 項目以逗號分隔的清單。
  • 路徑:要修改的檔案或目錄。

範例

  • hadoop fs -setfacl -m user:hadoop:rw- /file
  • hadoop fs -setfacl -x user:hadoop /file
  • hadoop fs -setfacl -b /file
  • hadoop fs -setfacl -k /dir
  • hadoop fs -setfacl --set user::rw-,user:hadoop:rw-,group::r--,other::r-- /file
  • hadoop fs -setfacl -R -m user:hadoop:r-x /dir
  • hadoop fs -setfacl -m default:user:hadoop:r-x /dir

結束代碼

成功時傳回 0,錯誤時傳回非 0 值。

setfattr

用法:hadoop fs -setfattr -n 名稱 [-v 值] | -x 名稱 <路徑>

設定檔案或目錄的延伸屬性名稱和值。

選項

  • -n 名稱:延伸屬性名稱。
  • -v 值:延伸屬性值。值的編碼方法有以下三種。如果參數用雙引號括起來,則值為引號內的字串。如果參數以 0x 或 0X 為前綴,則視為十六進位數字。如果參數以 0s 或 0S 開頭,則視為 base64 編碼。
  • -x 名稱:移除延伸屬性。
  • 路徑:檔案或目錄。

範例

  • hadoop fs -setfattr -n user.myAttr -v myValue /file
  • hadoop fs -setfattr -n user.noValue /file
  • hadoop fs -setfattr -x user.myAttr /file

結束代碼

成功時傳回 0,錯誤時傳回非 0 值。

setrep

用法:hadoop fs -setrep [-R] [-w] <numReplicas> <路徑>

變更檔案的複製因子。如果路徑是目錄,則此指令會遞迴變更路徑根目錄下的所有檔案的複製因子。執行此指令時會忽略 EC 檔案。

選項

  • -w 旗標要求指令等到複製完成。這可能會花費很長的時間。
  • -R 旗標是為了向後相容而接受的。它沒有作用。

範例

  • hadoop fs -setrep -w 3 /user/hadoop/dir1

結束代碼

成功時傳回 0,錯誤時傳回 -1。

stat

用法:hadoop fs -stat [格式] <路徑> ...

列印 <path> 中檔案/目錄的統計資料,格式為指定格式。格式接受八進位 (%a) 和符號 (%A) 權限、位元組檔案大小 (%b)、類型 (%F)、擁有者的群組名稱 (%g)、名稱 (%n)、區塊大小 (%o)、複製 (%r)、擁有者的使用者名稱 (%u)、存取日期 (%x, %X) 和修改日期 (%y, %Y)。%x 和 %y 以「yyyy-MM-dd HH:mm:ss」顯示 UTC 日期,而 %X 和 %Y 則顯示自 1970 年 1 月 1 日 UTC 以來的毫秒數。如果未指定格式,則預設使用 %y。

範例

  • hadoop fs -stat "type:%F perm:%a %u:%g size:%b mtime:%y atime:%x name:%n" /file

結束代碼:成功傳回 0,錯誤傳回 -1。

tail

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

將檔案的最後一 KB 顯示至 stdout。

選項

  • -f 選項會在檔案成長時輸出附加的資料,就像 Unix 一樣。

範例

  • hadoop fs -tail pathname

結束代碼:成功傳回 0,錯誤傳回 -1。

test

用法:hadoop fs -test -[defswrz] URI

選項

  • -d:如果路徑是目錄,則傳回 0。
  • -e:如果路徑存在,則傳回 0。
  • -f:如果路徑是檔案,則傳回 0。
  • -s:如果路徑不為空,則傳回 0。
  • -w:如果路徑存在且已授予寫入權限,則傳回 0。
  • -r:如果路徑存在且已授予讀取權限,則傳回 0。
  • -z:如果檔案長度為零,則傳回 0。

範例

  • hadoop fs -test -e filename

text

用法:hadoop fs -text <src>

取得來源檔案並以文字格式輸出檔案。允許的格式為 zip 和 TextRecordInputStream。

touch

用法:hadoop fs -touch [-a] [-m] [-t TIMESTAMP] [-c] URI [URI ...]

將 URI 指定的檔案的存取時間和修改時間更新為目前時間。如果檔案不存在,則會在 URI 建立一個長度為零的檔案,並將目前時間設為該 URI 的時間戳記。

  • 使用 -a 選項僅變更存取時間
  • 使用 -m 選項僅變更修改時間
  • 使用 -t 選項指定時間戳記(格式為 yyyyMMdd:HHmmss),而非目前時間
  • 使用 -c 選項如果檔案不存在,則不建立檔案

時間戳記格式如下 * yyyy 四位數年份(例如 2018) * MM 年份的兩位數月份(例如 08 代表 8 月) * dd 月份的兩位數日期(例如 01 代表該月份的第一天) * HH 使用 24 小時制表示的兩位數小時(例如 23 代表晚上 11 點,11 代表上午 11 點) * mm 小時的兩位數分鐘 * ss 分鐘的兩位數秒數例如 20180809:230000 代表 2018 年 8 月 9 日晚上 11 點

範例

  • hadoop fs -touch 路徑名稱
  • hadoop fs -touch -m -t 20180809:230000 路徑名稱
  • hadoop fs -touch -t 20180809:230000 路徑名稱
  • hadoop fs -touch -a 路徑名稱

結束代碼:成功傳回 0,錯誤傳回 -1。

touchz

用法:hadoop fs -touchz URI [URI ...]

建立一個長度為 0 的檔案。如果檔案存在且長度不為 0,則會傳回錯誤。

範例

  • hadoop fs -touchz 路徑名稱

結束代碼:成功傳回 0,錯誤傳回 -1。

truncate

用法:hadoop fs -truncate [-w] <length> <paths>

將所有符合指定檔案模式的檔案截斷為指定長度。

選項

  • 如果需要,-w 旗標會要求命令等待區塊復原完成。
    如果沒有 -w 旗標,則在復原進行中時,檔案可能會在一段時間內保持未關閉狀態。
    在這段時間內,無法重新開啟檔案進行附加。

範例

  • hadoop fs -truncate 55 /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -truncate -w 127 hdfs://nn1.example.com/user/hadoop/file1

concat

用法:hadoop fs -concat <target file> <source files>

將現有的來源檔案串接成目標檔案。目標檔案和來源檔案應位於同一個目錄中。

範例

  • hadoop fs -concat hdfs://cluster/user/hadoop/target-file hdfs://cluster/user/hadoop/file-0 hdfs://cluster/user/hadoop/file-1

usage

用法:hadoop fs -usage command

傳回個別命令的說明。

使用物件儲存

Hadoop FileSystem shell 可與物件儲存(例如 Amazon S3、Azure ABFS 和 Google GCS)搭配使用。

# Create a directory
hadoop fs -mkdir s3a://bucket/datasets/

# Upload a file from the cluster filesystem
hadoop fs -put /datasets/example.orc s3a://bucket/datasets/

# touch a file
hadoop fs -touchz wasb://yourcontainer@youraccount.blob.core.windows.net/touched

與一般檔案系統不同,在物件儲存中變更檔案和目錄名稱通常需要與所操作物件大小成正比的時間。由於許多檔案系統 shell 作業會在作業的最後階段使用變更名稱,因此略過該階段可以避免長時間延遲。

特別是,putcopyFromLocal 命令都應設定 -d 選項以進行直接上傳。

# Upload a file from the cluster filesystem
hadoop fs -put -d /datasets/example.orc s3a://bucket/datasets/

# Upload a file from under the user's home directory in the local filesystem.
# Note it is the shell expanding the "~", not the hadoop fs command
hadoop fs -copyFromLocal -d -f ~/datasets/devices.orc s3a://bucket/datasets/

# create a file from stdin
# the special "-" source means "use stdin"
echo "hello" | hadoop fs -put -d -f - wasb://yourcontainer@youraccount.blob.core.windows.net/hello.txt

可以下載和檢視物件

# copy a directory to the local filesystem
hadoop fs -copyToLocal s3a://bucket/datasets/

# copy a file from the object store to the cluster filesystem.
hadoop fs -get wasb://yourcontainer@youraccount.blob.core.windows.net/hello.txt /examples

# print the object
hadoop fs -cat wasb://yourcontainer@youraccount.blob.core.windows.net/hello.txt

# print the object, unzipping it if necessary
hadoop fs -text wasb://yourcontainer@youraccount.blob.core.windows.net/hello.txt

## download log files into a local file
hadoop fs -getmerge wasb://yourcontainer@youraccount.blob.core.windows.net/logs\* log.txt

列出許多檔案的指令往往會比在 HDFS 或其他檔案系統中工作時慢很多

hadoop fs -count s3a://bucket/
hadoop fs -du s3a://bucket/

其他執行速度較慢的指令包括 findmvcprm

尋找

在提供路徑下有許多目錄的大型儲存空間中,這可能會非常慢。

# enumerate all files in the object store's container.
hadoop fs -find s3a://bucket/ -print

# remember to escape the wildcards to stop the shell trying to expand them first
hadoop fs -find s3a://bucket/datasets/ -name \*.txt -print

重新命名

重新命名檔案的時間取決於其大小。

重新命名目錄的時間取決於該目錄下所有檔案的數量和大小。

hadoop fs -mv s3a://bucket/datasets s3a://bucket/historical

如果中斷作業,物件儲存空間將處於未定義的狀態。

複製

hadoop fs -cp s3a://bucket/datasets s3a://bucket/historical

複製作業會讀取每個檔案,然後將其寫回物件儲存空間;完成所需的時間取決於要複製的資料量,以及本機電腦與物件儲存空間之間在兩個方向上的頻寬。

電腦離物件儲存空間越遠,複製所需的時間就越長

刪除物件

rm 指令會刪除物件和裝滿物件的目錄。如果物件儲存空間是最終一致的,fs ls 指令和其他存取器可能會簡短地傳回現已刪除物件的詳細資料;這是物件儲存空間無法避免的人工製品。

如果檔案系統用戶端設定為將檔案複製到垃圾桶目錄,這將會在儲存區中;然後,rm 作業所需的時間會與資料大小成正比。此外,已刪除的檔案將繼續產生儲存成本。

為避免此情況,請使用 -skipTrash 選項。

hadoop fs -rm -skipTrash s3a://bucket/dataset

移到 .Trash 目錄的資料可以使用 expunge 指令清除。由於此指令僅適用於預設檔案系統,因此必須設定為將預設檔案系統設為目標物件儲存空間。

hadoop fs -expunge -D fs.defaultFS=s3a://bucket/

覆寫物件

如果物件儲存空間是最終一致的,則任何覆寫現有物件的作業可能不會立即對所有用戶端/查詢可見。也就是說:稍後查詢相同物件狀態或內容的作業可能會取得先前的物件。有時,這會在同一個用戶端中浮現,同時讀取單一物件。

避免使用會覆寫物件的命令序列,然後立即處理更新的資料;這樣可能會使用前一個資料。

時間戳記

物件儲存體中物件和目錄的時間戳記可能不會遵循 HDFS 中檔案和目錄的行為。

  1. 物件的建立和初始修改時間會是它在物件儲存體上建立的時間;這會在寫入程序結束時,而不是開始時。
  2. 時間戳記會從物件儲存體基礎架構的時鐘取得,而不是客戶端。
  3. 如果覆寫物件,修改時間會更新。
  4. 目錄可能會有或沒有有效時間戳記。當底下的物件更新時,它們的修改時間不太可能會更新。
  5. Apache Hadoop 程式碼庫中找到的任何物件儲存體都不支援 atime 存取時間功能。

請參閱 DistCp 文件,以了解這可能會如何影響 distcp -update 作業。

安全性模型和作業

物件儲存體的安全性與權限模型通常與 Unix 風格檔案系統的安全性與權限模型非常不同;查詢或操作權限的作業通常不受支援。

適用於此的作業包括:chgrpchmodchowngetfaclsetfacl。相關的屬性命令 getfattrsetfattr 通常也無法使用。

  • 列出權限和使用者/群組詳細資料的檔案系統命令通常會模擬這些詳細資料。

  • 嘗試保留權限的作業(例如 fs -put -p)不會保留權限,原因如此。(特殊情況:wasb://,保留權限但不會強制執行它們)。

與唯讀物件儲存體互動時,「列出」和「狀態」命令中找到的權限可能會指出使用者具有寫入存取權,但事實上他們沒有。

物件儲存體通常有自己的權限模型,這些模型可透過特定於儲存體的工具進行操作。請注意,物件儲存體可能提供的部分權限(例如唯寫路徑,或根路徑上的不同權限)可能與 Hadoop 檔案系統客戶端不相容。這些權限往往需要對他們寫入資料的整個物件儲存體儲存區/容器具有完整的讀取和寫入存取權。

以下是 Amazon 公開的 Landsat 影像唯讀儲存區清單,作為權限如何被模擬的範例

$ hadoop fs -ls s3a://landsat-pds/
Found 10 items
drwxrwxrwx   - mapred          0 2016-09-26 12:16 s3a://landsat-pds/L8
-rw-rw-rw-   1 mapred      23764 2015-01-28 18:13 s3a://landsat-pds/index.html
drwxrwxrwx   - mapred          0 2016-09-26 12:16 s3a://landsat-pds/landsat-pds_stats
-rw-rw-rw-   1 mapred        105 2016-08-19 18:12 s3a://landsat-pds/robots.txt
-rw-rw-rw-   1 mapred         38 2016-09-26 12:16 s3a://landsat-pds/run_info.json
drwxrwxrwx   - mapred          0 2016-09-26 12:16 s3a://landsat-pds/runs
-rw-rw-rw-   1 mapred   27458808 2016-09-26 12:16 s3a://landsat-pds/scene_list.gz
drwxrwxrwx   - mapred          0 2016-09-26 12:16 s3a://landsat-pds/tarq
drwxrwxrwx   - mapred          0 2016-09-26 12:16 s3a://landsat-pds/tarq_corrupt
drwxrwxrwx   - mapred          0 2016-09-26 12:16 s3a://landsat-pds/test
  1. 所有檔案都被列為具有完整的讀取/寫入權限。
  2. 所有目錄似乎都有完整的 rwx 權限。
  3. 所有檔案的複製計數為「1」。
  4. 所有檔案和目錄的所有者宣告為目前使用者 (mapred)。
  5. 所有目錄的時間戳記實際上是執行 -ls 作業的時間。這是因為這些目錄並非儲存中的實際物件;它們是根據其路徑下物件的存在模擬的目錄。

當嘗試刪除其中一個檔案時,作業會失敗,即使 ls 指令顯示有權限。

$ hadoop fs -rm s3a://landsat-pds/scene_list.gz
rm: s3a://landsat-pds/scene_list.gz: delete on s3a://landsat-pds/scene_list.gz:
  com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3;
  Status Code: 403; Error Code: AccessDenied; Request ID: 1EF98D5957BCAB3D),
  S3 Extended Request ID: wi3veOXFuFqWBUCJgV3Z+NQVj9gWgZVdXlPU4KBbYMsw/gA+hyhRXcaQ+PogOsDgHh31HlTCebQ=

這表示無法將列出的權限視為寫入存取的證據;只有物件操作才能確定這一點。

請注意,Microsoft Azure WASB 檔案系統確實允許設定和檢查權限,但實際上並未強制執行權限。此功能提供將 HDFS 目錄樹備份至 DistCp 的功能,並保留其權限,這些權限可能會在將目錄複製回 HDFS 時還原。然而,為了保護物件儲存中資料的存取,必須使用 Azure 的自有模型和工具

效用有限的指令

以下是通常沒有作用,甚至可能會失敗的殼層指令清單。

指令 限制
appendToFile 通常不支援
checksum 通常的檢查碼為「NONE」
chgrp 通常不支援的權限模型;無作用
chmod 通常不支援的權限模型;無作用
chown 通常不支援的權限模型;無作用
createSnapshot 通常不支援
deleteSnapshot 通常不支援
df 通常會顯示預設值
getfacl 可能會或可能不會支援
getfattr 通常支援
renameSnapshot 通常不支援
setfacl 通常不支援的權限模型
setfattr 通常不支援的權限模型
setrep 沒有作用
truncate 通常不支援
concat 通常不支援

不同的物件儲存用戶端可能會支援這些指令:請參閱文件並針對目標儲存進行測試。