概述

文件系统 (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。

checksum

用法: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

ERASURECODING_POLICY 是该文件的策略名称。如果在该文件上设置了擦除编码策略,它将返回该策略的名称。如果没有设置擦除编码策略,它将返回“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) 源和目标文件系统支持它们(仅 HDFS),并且 (2) 所有源和目标路径名都在 /.reserved/raw 层次结构中,则保留“raw.*”命名空间扩展属性。是否保留 raw.* 命名空间 xattr 的确定与 -p(保留)标志无关。

选项

  • -f:如果目标已存在,则覆盖它。
  • -d:跳过创建带有后缀 ._COPYING_ 的临时文件。
  • -p:保留文件属性 [topx](时间戳、所有权、权限、ACL、XAttr)。如果指定 -p 但没有 arg,则保留时间戳、所有权、权限。如果指定 -pa,则保留权限,因为 ACL 是权限的超集。是否保留原始命名空间扩展属性的确定与 -p 标志无关。
  • -t <thread count>:要使用的线程数,默认为 1。在复制包含 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。

createSnapshot

请参阅 HDFS 快照指南

deleteSnapshot

请参阅 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>]

从回收站目录中永久删除保留时间阈值较旧的检查点中的文件,并创建新的检查点。

创建检查点时,回收站中最近删除的文件将移至该检查点下。在下次调用 -expunge 命令时,将永久删除 fs.trash.interval 较旧的检查点中的文件。

如果文件系统支持该功能,用户可以配置通过存储为 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 架构指南

find

用法:hadoop fs -find <path> ... <expression> ...

查找与指定表达式匹配的所有文件,并对它们应用选定的操作。如果没有指定 path,则默认为当前工作目录。如果没有指定表达式,则默认为 -print。

识别以下主要表达式

  • -name pattern

    -iname pattern

    如果文件的基名使用标准文件系统通配符与模式匹配,则评估为 true。如果使用 -iname,则匹配不区分大小写。

  • -print

    -print0

    始终评估为 true。导致将当前路径名写入标准输出。如果使用 -print0 表达式,则会附加一个 ASCII NULL 字符。

识别以下运算符

  • expression -a expression

    expression -and expression

    expression expression

    用于连接两个表达式的逻辑 AND 运算符。如果两个子表达式都返回 true,则返回 true。由两个表达式的并置暗示,因此无需明确指定。如果第一个表达式失败,则不会应用第二个表达式。

示例

hadoop fs -find / -name test -print

退出代码

成功时返回 0,错误时返回 -1。

get

用法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>

将文件复制到本地文件系统。使用 -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。

getfacl

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

显示文件和目录的访问控制列表 (ACL)。如果目录具有默认 ACL,则 getfacl 还将显示默认 ACL。

选项

  • -R:递归列出所有文件和目录的 ACL。
  • path:要列出的文件或目录。

示例

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

退出代码

成功时返回 0,出错时返回非零值。

getfattr

用法:hadoop fs -getfattr [-R] -n name | -d [-e en] <path>

显示文件或目录的扩展属性名称和值(如果存在)。

选项

  • -R:递归列出所有文件和目录的属性。
  • -n name:转储命名的扩展属性值。
  • -d:转储与路径名关联的所有扩展属性值。
  • -e encoding:检索值后对值进行编码。有效的编码为“text”、“hex”和“base64”。编码为文本字符串的值用双引号 (") 括起来,编码为十六进制和 base64 的值分别以 0x 和 0s 为前缀。
  • path:文件或目录。

示例

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

退出代码

成功时返回 0,出错时返回非零值。

getmerge

用法:hadoop fs -getmerge [-nl] <src> <localdst>

将源目录和目标文件作为输入,并将 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,出错时返回非零值。

head

用法:hadoop fs -head URI

将文件的前 1 KB 显示到 stdout。

示例

  • hadoop fs -head pathname

退出代码:成功时返回 0,出错时返回 -1。

help

用法:hadoop fs -help

返回用法输出。

ls

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

选项

  • -C:仅显示文件和目录的路径。
  • -d:目录将作为普通文件列出。
  • -h:以人类可读的方式格式化文件大小(例如 64.0m 而不是 67108864)。
  • -q:打印 ? 而不是不可打印的字符。
  • -R:递归列出遇到的子目录。
  • -t:按修改时间(最近的排在最前面)对输出进行排序。
  • -S:按文件大小对输出进行排序。
  • -r:反转排序顺序。
  • -u:使用访问时间而不是修改时间进行显示和排序。
  • -e:仅显示文件和目录的擦除编码策略。

对于文件,ls 返回具有以下格式的文件状态

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。在上传包含 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 中)设置大于零的值来启用回收站。

有关回收站中文件的删除,请参见 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 条目的逗号分隔列表。
  • path:要修改的文件或目录。

示例

  • 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,出错时返回非零值。

setfattr

用法:hadoop fs -setfattr -n name [-v value] | -x name <path>

为文件或目录设置扩展属性名称和值。

选项

  • -n name:扩展属性名称。
  • -v 值:扩展属性值。有三种不同的值编码方法。如果参数用双引号括起来,则值就是引号内的字符串。如果参数以 0x 或 0X 为前缀,则将其视为十六进制数。如果参数以 0s 或 0S 开头,则将其视为 base64 编码。
  • -x 名称:删除扩展属性。
  • path:文件或目录。

示例

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

退出代码

成功时返回 0,出错时返回非零值。

setrep

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

更改文件的副本数。如果path是目录,则命令会递归更改path根目录下的所有文件的副本数。执行此命令时将忽略 EC 文件。

选项

  • -w 标志请求命令等待副本完成。这可能需要很长时间。
  • -R 标志是为了向后兼容而接受的。它没有效果。

示例

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

退出代码

成功时返回 0,错误时返回 -1。

stat

用法:hadoop fs -stat [format] <path> ...

以指定格式打印 <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

将文件的最后千字节显示到 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 表示八月) * dd 一个月中的两位数日期(例如 01 表示该月的第一天) * HH 使用 24 小时制的一天中的两位数小时(例如 23 表示晚上 11 点,11 表示上午 11 点) * mm 一小时中的两位数分钟 * ss 一分钟中的两位数秒例如 20180809:230000 表示 2018 年 8 月 9 日晚上 11 点

示例

  • hadoop fs -touch pathname
  • hadoop fs -touch -m -t 20180809:230000 pathname
  • hadoop fs -touch -t 20180809:230000 pathname
  • hadoop fs -touch -a pathname

退出代码:成功时返回 0,出错时返回 -1。

touchz

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

创建一个零长度文件。如果文件存在且长度不为零,则返回错误。

示例

  • hadoop fs -touchz pathname

退出代码:成功时返回 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://[email protected]/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://[email protected]/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://[email protected]/hello.txt /examples

# print the object
hadoop fs -cat wasb://[email protected]/hello.txt

# print the object, unzipping it if necessary
hadoop fs -text wasb://[email protected]/hello.txt

## download log files into a local file
hadoop fs -getmerge wasb://[email protected]/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

可以使用 expunge 命令清除移动到 .Trash 目录中的数据。由于此命令仅适用于默认文件系统,因此必须将其配置为将默认文件系统设为目标对象存储。

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

覆盖对象

如果对象存储是最终一致的,则任何覆盖现有对象的操作可能不会立即对所有客户端/查询可见。也就是说:稍后查询同一对象状态或内容的操作可能会获取前一个对象。有时,在读取单个对象时,这可能会在同一客户端中出现。

避免出现一系列覆盖对象然后立即处理更新数据的命令;存在使用先前数据而不是更新数据的风险。

时间戳

对象存储中的对象和目录的时间戳可能与 HDFS 中的文件和目录的行为不同。

  1. 对象的创建和初始修改时间将是它在对象存储中创建的时间;这将在写入过程的末尾,而不是开头。
  2. 时间戳将从对象存储基础架构的时钟获取,而不是客户端的时钟。
  3. 如果对象被覆盖,则修改时间将被更新。
  4. 目录可能具有或不具有有效时间戳。当下面的对象被更新时,它们不太可能更新其修改时间。
  5. atime 访问时间功能不受 Apache Hadoop 代码库中找到的任何对象存储支持。

有关这如何影响 distcp -update 操作的详细信息,请参阅 DistCp 文档。

安全模型和操作

对象存储的安全和权限模型通常与 Unix 风格的文件系统非常不同;查询或操作权限的操作通常不受支持。

适用于此操作的操作包括:chgrpchmodchowngetfaclsetfacl。相关的属性命令 getfattrsetfattr 通常也不可用。

  • 列出权限和用户/组详细信息的文件系统命令通常模拟这些详细信息。

  • 尝试保留权限的操作(例如 fs -put -p)由于此原因不保留权限。(特殊情况:wasb://,它保留权限但不强制执行权限)。

在与只读对象存储交互时,“列表”和“状态”命令中找到的权限可能表明用户具有写访问权限,但实际上他们没有。

对象存储通常有自己的权限模型,可以通过特定于存储的工具操作模型。请注意,对象存储可能提供的某些权限(例如仅写路径或根路径上的不同权限)可能与 Hadoop 文件系统客户端不兼容。这些权限往往要求对写入数据的整个对象存储存储桶/容器具有完全的读写权限。

以下列出亚马逊的 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 文件系统确实允许设置和检查权限,但实际上并不强制执行权限。此功能提供了使用 DistCp 备份 HDFS 目录树的能力,同时保留其权限,这些权限在将目录复制回 HDFS 时可以恢复。但是,为了保护对对象存储中数据的访问,必须使用 Azure 的自己的模型和工具

价值有限的命令

以下是通常无效——实际上可能会失败的 shell 命令列表。

命令 限制
appendToFile 通常不受支持
checksum 通常的校验和为“NONE”
chgrp 通常不支持的权限模型;无操作
chmod 通常不支持的权限模型;无操作
chown 通常不支持的权限模型;无操作
createSnapshot 通常不受支持
deleteSnapshot 通常不受支持
df 通常会显示默认值
getfacl 可能支持,也可能不支持
getfattr 通常支持
renameSnapshot 通常不受支持
setfacl 通常不支持的权限模型
setfattr 通常不支持的权限模型
setrep 没有效果
truncate 通常不受支持
concat 通常不受支持

不同的对象存储客户端可能支持这些命令:请查阅文档并针对目标存储进行测试。