檔案系統 (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 選項。
用法: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。
用法: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
用法:hadoop fs -chgrp [-R] GROUP URI [URI ...]
變更檔案的群組關聯。使用者必須是檔案的所有者,否則必須是超級使用者。其他資訊請參閱 權限指南。
選項
-R
選項會在目錄結構中遞迴變更。用法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]
變更檔案的權限。使用 -R
時,會在目錄結構中遞迴變更。使用者必須是檔案的所有者,否則必須是超級使用者。其他資訊請參閱 權限指南。
選項
-R
選項會在目錄結構中遞迴變更。用法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
變更檔案的所有者。使用者必須是超級使用者。其他資訊請參閱 權限指南。
選項
-R
選項會在目錄結構中遞迴變更。與 -put
指令相同。
與 -get
指令相同。
用法: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。
用法: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 快照指南。
用法:hadoop fs -df [-h] URI [URI ...]
顯示可用空間。
選項
範例
hadoop dfs -df /user/hadoop/dir1
用法:hadoop fs -du [-s] [-h] [-v] [-x] URI [URI ...]
顯示指定目錄中所含檔案和目錄的大小,或如果只是一個檔案,則顯示檔案長度。
選項
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。
用法:hadoop fs -dus <args>
顯示檔案長度的摘要。
注意:此命令已棄用。請改用 hadoop fs -du -s
。
用法: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 字元。
識別下列運算子
用於結合兩個表達式的邏輯 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。
用法:hadoop fs -getfacl [-R] <路徑>
顯示檔案和目錄的存取控制清單 (ACL)。如果目錄有預設 ACL,則 getfacl 也會顯示預設 ACL。
選項
範例
hadoop fs -getfacl /file
hadoop fs -getfacl -R /dir
結束代碼
成功時傳回 0,錯誤時傳回非 0 值。
用法:hadoop fs -getfattr [-R] -n 名稱 | -d [-e 編碼] <路徑>
顯示檔案或目錄的延伸屬性名稱和值(如果有)。
選項
範例
hadoop fs -getfattr -d /file
hadoop fs -getfattr -R -n user.myAttr /dir
結束代碼
成功時傳回 0,錯誤時傳回非 0 值。
用法: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 值。
用法:hadoop fs -head URI
將檔案的第一個千位元組顯示至標準輸出。
範例
hadoop fs -head 路徑名稱
結束代碼:成功傳回 0,錯誤傳回 -1。
用法:hadoop fs -help
傳回用法輸出。
用法:hadoop fs -ls [-C] [-d] [-h] [-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。
用法:hadoop fs -lsr <args>
ls 的遞迴版本。
注意:此命令已棄用。請改用 hadoop fs -ls -R
用法:hadoop fs -mkdir [-p] <paths>
將路徑 URI 作為引數並建立目錄。
選項
範例
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。
用法:hadoop fs -moveFromLocal <localsrc> <dst>
與 put 指令類似,但會在複製後刪除來源 localsrc。
用法:hadoop fs -moveToLocal [-crc] <src> <dst>
顯示「尚未實作」訊息。
用法: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。
用法: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。
請參閱 HDFS 快照指南。
用法:hadoop fs -rm [-f] [-r |-R] [-skipTrash] [-safely] URI [URI ...]
刪除指定為參數的文件。
如果已啟用資源回收筒,檔案系統會將已刪除的文件移至資源回收筒目錄(由 FileSystem#getTrashRoot 提供)。
目前,資源回收筒功能預設為停用。使用者可以設定參數 fs.trash.interval
(在 core-site.xml 中)為大於 0 的值來啟用資源回收筒。
請參閱 expunge 以了解資源回收筒中文件的刪除方式。
選項
hadoop.shell.delete.limit.num.files
(在 core-site.xml 中,預設值:100)的目錄之前,會要求安全性確認。它可以與 -skipTrash 搭配使用,以防止意外刪除大型目錄。在遞迴遍歷大型目錄以計算要刪除的文件數量之前,預期會出現延遲。範例
hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir
結束代碼
成功時傳回 0,錯誤時傳回 -1。
用法:hadoop fs -rmdir [--ignore-fail-on-non-empty] URI [URI ...]
刪除目錄。
選項
--ignore-fail-on-non-empty
:使用萬用字元時,如果目錄仍包含檔案,則不失敗。範例
hadoop fs -rmdir /user/hadoop/emptydir
用法:hadoop fs -rmr [-skipTrash] URI [URI ...]
刪除的遞迴版本。
注意:此命令已過時。請改用 hadoop fs -rm -r
用法:hadoop fs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>]
設定檔案和目錄的存取控制清單 (ACL)。
選項
--set
:完全取代 ACL,捨棄所有現有項目。acl_spec 必須包含使用者、群組和其他人項目的項目,以與權限位元組相容。如果 ACL 規格只包含存取項目,則會保留現有的預設項目。如果 ACL 規格只包含預設項目,則會保留現有的存取項目。如果 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 值。
用法:hadoop fs -setfattr -n 名稱 [-v 值] | -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 值。
用法:hadoop fs -setrep [-R] [-w] <numReplicas> <路徑>
變更檔案的複製因子。如果路徑是目錄,則此指令會遞迴變更路徑根目錄下的所有檔案的複製因子。執行此指令時會忽略 EC 檔案。
選項
範例
hadoop fs -setrep -w 3 /user/hadoop/dir1
結束代碼
成功時傳回 0,錯誤時傳回 -1。
用法: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。
用法:hadoop fs -tail [-f] URI
將檔案的最後一 KB 顯示至 stdout。
選項
範例
hadoop fs -tail pathname
結束代碼:成功傳回 0,錯誤傳回 -1。
用法:hadoop fs -test -[defswrz] URI
選項
範例
hadoop fs -test -e filename
用法:hadoop fs -text <src>
取得來源檔案並以文字格式輸出檔案。允許的格式為 zip 和 TextRecordInputStream。
用法:hadoop fs -touch [-a] [-m] [-t TIMESTAMP] [-c] URI [URI ...]
將 URI 指定的檔案的存取時間和修改時間更新為目前時間。如果檔案不存在,則會在 URI 建立一個長度為零的檔案,並將目前時間設為該 URI 的時間戳記。
時間戳記格式如下 * 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。
用法:hadoop fs -touchz URI [URI ...]
建立一個長度為 0 的檔案。如果檔案存在且長度不為 0,則會傳回錯誤。
範例
hadoop fs -touchz 路徑名稱
結束代碼:成功傳回 0,錯誤傳回 -1。
用法:hadoop fs -truncate [-w] <length> <paths>
將所有符合指定檔案模式的檔案截斷為指定長度。
選項
範例
hadoop fs -truncate 55 /user/hadoop/file1 /user/hadoop/file2
hadoop fs -truncate -w 127 hdfs://nn1.example.com/user/hadoop/file1
用法: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
用法: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 作業會在作業的最後階段使用變更名稱,因此略過該階段可以避免長時間延遲。
特別是,put
和 copyFromLocal
命令都應設定 -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/
其他執行速度較慢的指令包括 find
、mv
、cp
和 rm
。
尋找
在提供路徑下有許多目錄的大型儲存空間中,這可能會非常慢。
# 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 中檔案和目錄的行為。
atime
存取時間功能。請參閱 DistCp
文件,以了解這可能會如何影響 distcp -update
作業。
物件儲存體的安全性與權限模型通常與 Unix 風格檔案系統的安全性與權限模型非常不同;查詢或操作權限的作業通常不受支援。
適用於此的作業包括:chgrp
、chmod
、chown
、getfacl
和 setfacl
。相關的屬性命令 getfattr
和 setfattr
通常也無法使用。
列出權限和使用者/群組詳細資料的檔案系統命令通常會模擬這些詳細資料。
嘗試保留權限的作業(例如 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
rwx
權限。mapred
)。-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 |
通常不支援 |
不同的物件儲存用戶端可能會支援這些指令:請參閱文件並針對目標儲存進行測試。