文件系统(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选项。
用法: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。
用法: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
用法:hadoop fs -chgrp [-R] GROUP URI [URI ...]
更改文件的所属组。用户必须是文件的所有者,否则需要具备超级用户权限。更多信息请参阅权限指南。
选项
用法:hadoop fs -chmod [-R]
更改文件的权限。使用-R选项时,将递归地对目录结构进行更改。用户必须是文件的所有者,或者是超级用户。更多信息请参阅权限指南。
选项
用法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
更改文件的所有者。用户必须是超级用户。更多信息请参阅权限指南。
选项
与-put命令完全相同。
与-get命令相同。
用法:hadoop fs -count [-q] [-h] [-v] [-x] [-t [
统计与指定文件模式匹配的路径下的目录数量、文件数量和字节数。获取配额和使用情况。带有-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。
用法:hadoop fs -cp [-f] [-p | -p[topax]] [-d] [-t
将文件从源位置复制到目标位置。该命令允许多个源文件,此时目标必须是一个目录。
如果满足以下两个条件,'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。
参见 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
显示文件长度的摘要。
注意: 此命令已弃用。请改用 hadoop fs -du -s
。
用法: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字符。
以下操作符被识别:
用于连接两个表达式的逻辑与运算符。如果两个子表达式都返回true,则返回true。通过两个表达式的并列隐含表示,因此不需要显式指定。如果第一个表达式失败,则不会应用第二个表达式。
示例:
hadoop fs -find / -name test -print
退出代码:
成功时返回0,出错时返回-1。
用法:hadoop fs -get [-ignoreCrc] [-crc] [-p] [-f] [-t
将文件复制到本地文件系统。校验失败的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。
用法:hadoop fs -getfacl [-R]
显示文件和目录的访问控制列表(ACLs)。如果目录具有默认ACL,则getfacl命令还会显示该默认ACL。
选项:
示例:
hadoop fs -getfacl /file
hadoop fs -getfacl -R /dir
退出代码:
成功时返回0,出错时返回非零值。
用法:hadoop fs -getfattr [-R] -n name | -d [-e en]
显示文件或目录的扩展属性名称和值(如果有的话)。
选项:
示例:
hadoop fs -getfattr -d /file
hadoop fs -getfattr -R -n user.myAttr /dir
退出代码:
成功时返回0,出错时返回非零值。
用法: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
返回使用情况输出。
用法:hadoop fs -ls [-C] [-d] [-h] [-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。
用法:hadoop fs -lsr
ls命令的递归版本。
注意: 此命令已弃用。请改用 hadoop fs -ls -R
用法:hadoop fs -mkdir [-p]
将路径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
与put命令类似,不同之处在于源文件localsrc在复制后会被删除。
用法:hadoop fs -moveToLocal [-crc]
显示“尚未实现”的消息。
用法: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。
用法:hadoop fs -put [-f] [-p] [-l] [-d] [-t
将单个源文件或多个源文件从本地文件系统复制到目标文件系统。如果源设置为“-”,还可以从标准输入读取数据并写入目标文件系统。
如果文件已存在,复制将失败,除非指定了 -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。
参见 HDFS 快照指南。
用法:hadoop fs -rm [-f] [-r |-R] [-skipTrash] [-safely] URI [URI ...]
删除指定为参数的文件。
如果启用了回收站功能,文件系统会将删除的文件移至回收站目录(由FileSystem#getTrashRoot指定)。
目前,回收站功能默认处于禁用状态。用户可以通过在参数fs.trash.interval
(位于core-site.xml文件中)设置大于零的值来启用回收站。
参见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
设置文件和目录的访问控制列表(ACLs)。
选项:
--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,出错时返回非零值。
用法:hadoop fs -setfattr -n name [-v value] | -x name
为文件或目录设置扩展属性名称和值。
选项:
示例:
hadoop fs -setfattr -n user.myAttr -v myValue /file
hadoop fs -setfattr -n user.noValue /file
hadoop fs -setfattr -x user.myAttr /file
退出代码:
成功时返回0,出错时返回非零值。
用法:hadoop fs -setrep [-R] [-w]
更改文件的副本数量。如果路径是一个目录,则该命令会递归地更改以路径为根的目录树下所有文件的副本数量。执行此命令时将忽略EC文件。
选项:
示例:
hadoop fs -setrep -w 3 /user/hadoop/dir1
退出代码:
成功时返回0,出错时返回-1。
用法:hadoop fs -stat [format]
打印指定
示例:
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
将文件的最后千字节显示到标准输出。
选项:
示例:
hadoop fs -tail pathname
退出代码:成功时返回0,出错时返回-1。
用法:hadoop fs -test -[defswrz] URI
选项:
示例:
hadoop fs -test -e filename
用法:hadoop fs -text
获取源文件并以文本格式输出文件。允许的格式为zip和TextRecordInputStream。
用法:hadoop fs -touch [-a] [-m] [-t TIMESTAMP] [-c] URI [URI ...]
将URI指定文件的访问和修改时间更新为当前时间。如果文件不存在,则会在URI路径创建一个零字节文件,并以当前时间作为该URI的时间戳。
时间戳格式如下 * 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。
用法:hadoop fs -touchz URI [URI ...]
创建一个零长度的文件。如果文件已存在且长度不为零,将返回错误。
示例:
hadoop fs -touchz pathname
退出代码:成功时返回0,出错时返回-1。
用法:hadoop fs -truncate [-w]
将所有匹配指定文件模式的文件截断至指定长度。
选项:
示例:
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 <目标文件> <源文件>
将现有的源文件合并到目标文件中。目标文件和源文件应位于同一目录下。
示例:
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 -update
操作的详细信息,请参阅DistCp
文档。
对象存储的安全和权限模型通常与Unix风格的文件系统有很大不同;查询或操作权限的操作通常不受支持。
此操作适用于以下命令:chgrp
、chmod
、chown
、getfacl
和setfacl
。相关的属性命令getfattr
和setfattr
通常也不可用。
文件系统命令通常模拟列出权限和用户/组详情的功能。
由于这个原因,尝试保留权限的操作(例如 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
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自身的模型和工具。
以下是通常无效且实际上可能会失败的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 |
不同的对象存储客户端可能支持这些命令:请查阅文档并针对目标存储进行测试。