概述

文件系统(FS) shell包含各种类似shell的命令,可直接与Hadoop分布式文件系统(HDFS)以及Hadoop支持的其他文件系统(如本地FS、WebHDFS、S3 FS等)进行交互。FS shell通过以下方式调用:

bin/hadoop fs <args>

所有FS shell命令都将路径URI作为参数。URI格式为scheme://authority/path。对于HDFS,方案是hdfs,而对于本地文件系统,方案是file。方案和授权部分是可选的。如果未指定,则使用配置中指定的默认方案。HDFS文件或目录如/parent/child可以指定为hdfs://namenodehost/parent/child,或者简写为/parent/child(假设您的配置已设置为指向hdfs://namenodehost)。

FS shell中的大多数命令行为类似于对应的Unix命令。差异会在每个命令中详细说明。错误信息会发送到stderr,而输出则发送到stdout。

如果正在使用HDFS,hdfs dfs是其同义词。

可以使用相对路径。对于HDFS来说,当前工作目录是HDFS主目录/user/,这个目录通常需要手动创建。HDFS主目录也可以被隐式访问,例如当使用HDFS回收站文件夹时,就是访问主目录中的.Trash目录。

请参阅命令手册了解通用shell选项。

appendToFile

用法:hadoop fs -appendToFile ...

将单个源文件或多个本地文件系统中的源文件追加到目标文件系统中。同时从标准输入读取内容并追加到目标文件系统。

  • 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 从标准输入读取数据。

退出代码:

成功时返回0,出错时返回1。

cat

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

将源路径复制到标准输出。

选项

  • -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 [URI ...]

返回文件的校验和信息。

选项

  • -v 选项显示文件的数据块大小。

示例:

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

chgrp

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

更改文件的所属组。用户必须是文件的所有者,否则需要具备超级用户权限。更多信息请参阅权限指南

选项

  • -R 选项将递归地对整个目录结构进行更改。

chmod

用法:hadoop fs -chmod [-R] 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 []] [-u] [-e] [-s]

统计与指定文件模式匹配的路径下的目录数量、文件数量和字节数。获取配额和使用情况。带有-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]] [-d] [-t ] [-q ] URI [URI ...]

将文件从源位置复制到目标位置。该命令允许多个源文件,此时目标必须是一个目录。

如果满足以下两个条件,'raw.*'命名空间的扩展属性将被保留:(1)源和目标文件系统支持这些属性(仅限HDFS),(2)所有源路径和目标路径都位于/.reserved/raw层级结构中。判断是否保留raw.*命名空间扩展属性与-p(保留)标志无关。

选项:

  • -f : 如果目标已存在则覆盖。
  • -d : 跳过创建带有._COPYING_后缀的临时文件。
  • -p : 保留文件属性[topax](时间戳、所有权、权限、ACL、扩展属性)。如果仅指定-p不带参数,则保留时间戳、所有权和权限。如果指定-pa,由于ACL是权限的超集,因此也会保留权限。是否保留原始命名空间扩展属性与-p标志无关。
  • -t : 使用的线程数,默认为1。当复制包含超过1个文件的目录时很有用。
  • -q : 指定使用的线程池队列大小,默认为1024。仅在线程数大于1时生效。

示例:

  • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -cp -f -d /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

显示文件长度的摘要。

注意: 此命令已弃用。请改用 hadoop fs -du -s

expunge

用法:hadoop fs -expunge [-immediate] [-fs ]

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

创建检查点时,回收站中最近删除的文件会被移动到该检查点下。早于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 模式

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

  • -print
    -print0

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

以下操作符被识别:

  • expression -a expression
    expression -and expression
    expression expression

    用于连接两个表达式的逻辑与运算符。如果两个子表达式都返回true,则返回true。通过两个表达式的并列隐含表示,因此不需要显式指定。如果第一个表达式失败,则不会应用第二个表达式。

示例:

hadoop fs -find / -name test -print

退出代码:

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

获取

用法:hadoop fs -get [-ignoreCrc] [-crc] [-p] [-f] [-t ] [-q ] ...

将文件复制到本地文件系统。校验失败的CRC文件可以通过-ignoreCrc选项强制复制。使用-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]

显示文件和目录的访问控制列表(ACLs)。如果目录具有默认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]

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

选项:

  • -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] [-skip-empty-file]

接收一个源目录和目标文件作为输入,并将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
  • hadoop fs -getmerge -nl -skip-empty-file /src/file1.txt /src/file2.txt /output.txt

退出代码:

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

头部

用法:hadoop fs -head URI

将文件的前1千字节显示到标准输出(stdout)。

示例:

  • hadoop fs -head pathname

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

帮助

用法: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命令返回以下格式的文件状态信息:

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

ls命令的递归版本。

注意: 此命令已弃用。请改用 hadoop fs -ls -R

mkdir

用法:hadoop fs -mkdir [-p]

将路径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

与put命令类似,不同之处在于源文件localsrc在复制后会被删除。

moveToLocal

用法:hadoop fs -moveToLocal [-crc]

显示“尚未实现”的消息。

mv

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

将文件从源位置移动到目标位置。该命令允许多个源文件,此时目标位置必须是一个目录。不允许跨文件系统移动文件。

示例:

  • 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 ] [-q ] [ - | ...]

将单个源文件或多个源文件从本地文件系统复制到目标文件系统。如果源设置为“-”,还可以从标准输入读取数据并写入目标文件系统。

如果文件已存在,复制将失败,除非指定了 -f 标志。

选项:

  • -p : 保留访问和修改时间、所有权以及权限(假设权限可以在文件系统之间传播)。
  • -f : 如果目标已存在则覆盖。
  • -l : 允许DataNode延迟将文件持久化到磁盘,强制复制因子为1。此标志会降低数据持久性,请谨慎使用。
  • -d : 跳过创建带有._COPYING_后缀的临时文件。
  • -t : 使用的线程数,默认为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 ] |[--set ]

设置文件和目录的访问控制列表(ACLs)。

选项:

  • -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

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

选项:

  • -n name: 扩展属性名称。
  • -v value: 扩展属性值。该值有三种不同的编码方式。如果参数用双引号括起来,则值为引号内的字符串。如果参数以0x或0X为前缀,则视为十六进制数。如果参数以0s或0S开头,则视为base64编码。
  • -x name: 移除扩展属性。
  • 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]

更改文件的副本数量。如果路径是一个目录,则该命令会递归地更改以路径为根的目录树下所有文件的副本数量。执行此命令时将忽略EC文件。

选项:

  • -w 标志表示要求命令等待复制完成。这可能会耗费很长时间。
  • -R 标志是为了向后兼容而保留的,它没有任何实际作用。

示例:

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

退出代码:

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

统计

用法:hadoop fs -stat [format] ...

打印指定路径下文件/目录的统计信息,支持以下格式参数:权限(八进制%a或符号表示%A)、文件大小字节数%b、文件类型%F、所属组名%g、名称%n、块大小%o、副本数%r、所属用户名%u、访问日期%x/%X以及修改日期%y/%Y。其中%x和%y显示UTC时间格式"yyyy-MM-dd HH:mm:ss",%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

将文件的最后千字节显示到标准输出。

选项:

  • -f 选项会在文件增长时输出追加的数据,类似于Unix中的行为。

示例:

  • hadoop fs -tail pathname

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

测试

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

选项:

  • -d: 如果路径是目录,则返回0。
  • -e: 如果路径存在,返回0。
  • -f: 如果路径是文件,返回0。
  • -s: 如果路径不为空,则返回0。
  • -w: 如果路径存在且具有写入权限,则返回0。
  • -r: 如果路径存在且具有读取权限,则返回0。
  • -z: 如果文件长度为0,则返回0。

示例:

  • hadoop fs -test -e filename

文本

用法:hadoop fs -text

获取源文件并以文本格式输出文件。允许的格式为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]

将所有匹配指定文件模式的文件截断至指定长度。

选项:

  • -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 <目标文件> <源文件>

将现有的源文件合并到目标文件中。目标文件和源文件应位于同一目录下。

示例:

  • 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操作将重命名作为操作的最后一步,跳过该步骤可以避免长时间的延迟。

特别是,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/

其他较慢的命令包括 find, mv, cprm

查找

在提供的路径下有许多目录的大型存储上,这可能会非常缓慢。

# 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 -update操作的详细信息,请参阅DistCp文档。

安全模型与操作

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

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

  • 文件系统命令通常模拟列出权限和用户/组详情的功能。

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

在与只读对象存储交互时,"list"和"stat"命令显示的权限可能表明用户具有写入权限,但实际上并不具备。

对象存储通常拥有自己的权限模型,这些模型可以通过特定于存储的工具进行操作。需要注意的是,对象存储可能提供的某些权限(如仅写路径或根路径上的不同权限)可能与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文件系统确实允许设置和检查权限,但这些权限实际上并未强制执行。此功能使得HDFS目录树能够通过DistCp进行备份,并保留其权限,这些权限在将目录复制回HDFS时可以恢复。然而,为了保护对对象存储中数据的访问,必须使用Azure自身的模型和工具

价值有限的命令

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

命令 限制条件
appendToFile generally unsupported
checksum the usual checksum is “NONE”
chgrp generally unsupported permissions model; no-op
chmod generally unsupported permissions model; no-op
chown generally unsupported permissions model; no-op
createSnapshot generally unsupported
deleteSnapshot generally unsupported
df default values are normally displayed
getfacl may or may not be supported
getfattr generally supported
renameSnapshot generally unsupported
setfacl generally unsupported permissions model
setfattr generally unsupported permissions model
setrep has no effect
truncate generally unsupported
concat generally unsupported

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