HDFS FileSystem Shell文件系统操作命令手册

关于File System (FS)

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

bin/hadoop fs <args>

所有FS Shell命令都将路径URI作为参数。URI格式为 scheme:// authority / path。对于HDFS,scheme为 hdfs,对于本地FS,scheme为 file。scheme和权限是可选的。如果未指定,则使用配置中指定的默认scheme。可以将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目录。

appendToFile

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

从本地文件系统添加一个或多个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 Reads the input from stdin.

返回值:

Returns 0 on success and 1 on error.

cat

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

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

参数:

  •  -ignoreCrc 禁用checkshum验证.

案例:

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

返回值:

Returns 0 on success and -1 on error.

checksum

使用方法: hadoop fs -checksum URI

返回文件的校验和信息。

案例:

  • 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

使用方法: hadoop fs -copyFromLocal <localsrc> URI

fs -put  命令相似  ,不同之处在于源仅限于本地文件引用。

参数:

  • -p : 保留访问和修改时间,所有权和权限。(假设权限可以在文件系统之间传播)
  • -f : 如果已经存在,则将其覆盖。
  • -l : 允许DataNode将文件延迟保存到磁盘,将复制因子强制为1。此标志将导致持久性降低。小心使用。
  • -d : 跳过后缀为._COPYING_.的临时文件的 创建

copyToLocal

使用方法: hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>

与get命令类似,除了仅限于本地文件引用。

count

使用方法: hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] <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”,这表示它使用复制存储策略。

案例:

  • 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

返回值:

Returns 0 on success and -1 on error.

cp

使用方法: hadoop fs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest>

复制文件,可以同时复制多个到一个目录中

如果源文件系统和目标文件系统支持(仅HDFS),并且所有源文件路径和目标路径名都在/.reserved/raw层次结构中,则保留'raw.*'namespace 扩展属性。确定是否保留raw.*namespace xattrs与-p(保留)标志无关。

参数:

  • -f 覆盖该目标
  • -p 保留文件属性[topx](时间戳,所有权,权限,ACL,XAttr)。如果-p不带  arg,则保留时间戳,所有权,权限。如果指定了-pa,则还将保留权限,因为ACL是权限的超集。确定是否保留原始名称空间扩展属性与-p标志无关。

案例:

  • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir

返回值:

Returns 0 on success and -1 on error.

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(包括给定路径下的所有快照)计算结果。

返回下列格式的三列:

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

返回值: Returns 0 on success and -1 on error.

dus

使用方法: hadoop fs -dus <args>

显示文件长度的摘要

Note: 不推荐使用此命令。而是使用  hadoop fs -du -s

expunge

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

永久删除垃圾箱目录中早于保留阈值的检查点中的文件,并创建新的检查点。

创建检查点时,垃圾桶中最近删除的文件将移动到检查点下。 下次调用-expunge  命令时,检查点中早于fs.trash.interval的文件  将被永久删除  。

如果文件系统支持该功能,则用户可以配置为通过存储在fs.trash.checkpoint.interval  (在core-site.xml中)的参数定期创建和删除检查点  。该值应小于或等于  fs.trash.interval

如果 传递了  -immediate选项,则将立即删除垃圾桶中当前用户的所有文件,而忽略  fs.trash.interval  设置。

find

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

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

可以识别以下主要表达式:

  • -name 匹配表达式
    -iname 匹配表达式

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

  • -print
    -print0

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

可以识别以下运算符:

  • expression -a expression
    expression -and expression
    expression expression

    用于连接两个表达式的逻辑AND运算符。如果两个子表达式都返回true,则返回true。两个表达式默认and,因此不需要明确指定。如果第一个表达式失败,则第二个表达式将不适用。

案例:

hadoop fs -find / -name test -print

返回值:

Returns 0 on success and -1 on error.

get

使用方法: hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] <src> <localdst>

将文件复制到本地文件系统。未通过CRC检查的文件可以使用-ignorecrc选项进行复制。可以使用-crc选项复制文件和CRC。

案例:

  • hadoop fs -get /user/hadoop/file localfile
  • hadoop fs -get hdfs://nn.example.com/user/hadoop/file localfile

返回值:

Returns 0 on success and -1 on error.

参数:

  • -p : 保留访问和修改时间,所有权和权限。(假设权限可以在文件系统之间传播)
  • -f : 覆盖
  • -ignorecrc : 跳过CRC检查
  • -crc: CRC校验

getfacl

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

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

参数:

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

案例:

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

返回值:

Returns 0 on success and non-zero on error.

getfattr

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

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

参数:

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

案例:

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

返回值:

Returns 0 on success and non-zero on error.

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

返回值:

Returns 0 on success and non-zero on error.

head

使用方法: hadoop fs -head URI

Displays first kilobyte of the file to stdout.

案例:

  • hadoop fs -head pathname

返回值: Returns 0 on success and -1 on error.

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

返回值:

Returns 0 on success and -1 on error.

lsr

使用方法: hadoop fs -lsr <args>

ls的递归版本。

Note:  不推荐使用此命令。而是使用  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

返回值:

Returns 0 on success and -1 on error.

moveFromLocal

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

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

moveToLocal

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

显示 “Not implemented yet” 信息.

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

返回值:

Returns 0 on success and -1 on error.

put

使用方法: hadoop fs -put [-f] [-p] [-l] [-d] [ - | <localsrc1> .. ]. <dst>

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

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

参数:

  • -p  :保留访问和修改时间,所有权和权限。(假设权限可以在文件系统之间传播)
  • -f  :如果目的地已经存在,则将其覆盖。
  • -l  :允许DataNode将文件延迟保存到磁盘,将复制因子强制为1。此标志将导致持久性降低。小心使用。
  • -d  :跳过后缀为._COPYING_的临时文件的  创建

案例:

  • 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 Reads the input from stdin.

返回值:

Returns 0 on success and -1 on error.

renameSnapshot

请参阅 HDFS快照指南 

rm

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

删除指定为args的文件。

如果启用了垃圾桶,则文件系统会将已删除的文件移动到垃圾桶目录

当前,默认情况下禁用垃圾桶功能。用户可以通过为参数fs.trash.interval  (在core-site.xml中)设置一个大于零的值来启用垃圾箱  。

参数:

  • -f 如果文件不存在,-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

返回值:

Returns 0 on success and -1 on error.

rmdir

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

删除文件夹

参数:

  • --ignore-fail-on-non-empty: When using wildcards, do not fail if a directory still contains files.

案例:

  • hadoop fs -rmdir /user/hadoop/emptydir

rmr

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

递归版本的删除。

Note: 不推荐使用此命令。而是使用  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

返回值:

Returns 0 on success and non-zero on error.

setfattr

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

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

参数:

  • -n名称:扩展属性名称。
  • -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

返回值:

Returns 0 on success and non-zero on error.

setrep

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

更改文件的复制因子。如果  path  是目录,则该命令以递归方式更改以path为根的目录树下所有文件的复制因子  。执行此命令时,将忽略EC文件。

参数:

  • The -w flag requests that the command wait for the replication to complete. This can potentially take a very long time.
  • The -R flag is accepted for backwards compatibility. It has no effect.

案例:

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

返回值:

Returns 0 on success and -1 on error.

stat

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

以指定格式打印有关<path>上文件/目录的统计信息。格式接受八进制(%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日以来的毫秒数。如果未指定格式,则默认使用%y。

案例:

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

返回值: Returns 0 on success and -1 on error.

tail

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

显示要输出的文件的最后千字节。

参数:

  • -f 随着文件的增长输出附加的数据

案例:

  • hadoop fs -tail pathname

返回值: Returns 0 on success and -1 on error.

test

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

参数:

  • -d:f路径是目录,返回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 指定时间戳记(格式为yyyyMMddHHmmss)而不是当前时间
  • -c 文件不存在,请使用-c选项不创建文件

时间戳格式如下:* yyyy四位数的年份(例如,2018)* MM一年的两位数字(例如,八月的月份为08)* dd月份的两位数字(例如,月的第一天为01)* HH以24小时表示法表示一天中的两位数小时(例如23代表11 pm,11代表11 am)* mm两位数字的分钟* ss分钟的两位数字,例如20180809230000表示2018年8月9日,11 pm

案例:

  • hadoop fs -touch pathname
  • hadoop fs -touch -m -t 20180809230000 pathname
  • hadoop fs -touch -t 20180809230000 pathname
  • hadoop fs -touch -a pathname

返回值: Returns 0 on success and -1 on error.

touchz

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

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

案例:

  • hadoop fs -touchz pathname

返回值: Returns 0 on success and -1 on error.

truncate

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

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

参数:

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

usage

使用方法: hadoop fs -usage command

返回单个命令的帮助。

对象存储

Hadoop FileSystem Shell与对象存储(例如Amazon S3,Azure WASB和OpenStack Swift)一起使用。

# 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

与普通文件系统不同,重命名对象存储中的文件和目录通常花费的时间与要操作的对象的大小成正比。由于许多文件系统外壳程序操作都将重命名用作操作的最后阶段,因此跳过该阶段可以避免长时间的延迟。

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

Find

在提供路径下有许多目录的大文件中,这可能非常慢。

# 枚举对象存储容器中的所有文件
hadoop fs -find s3a://bucket/ -print

# 记得先对通配符进行转义,以阻止shell尝试先扩展它们
hadoop fs -find s3a://bucket/datasets/ -name \*.txt -print

Rename

重命名文件的时间取决于其大小。

重命名目录的时间取决于该目录下所有文件的数量和大小。

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

如果操作被中断,则对象存储将处于未定义状态。

Copy

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/

覆盖对象

If an object store is eventually consistent, then any operation which overwrites existing objects may not be immediately visible to all clients/queries. That is: later operations which query the same object’s status or contents may get the previous object. This can sometimes surface within the same client, while reading a single object.

Avoid having a sequence of commands which overwrite objects and then immediately work on the updated data; there is a risk that the previous data will be used instead.

Timestamps

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

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

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

安全模型和操作

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

适用的操作包括:  chgrp,  chmod,  chown,  getfacl和  setfacl。相关的属性命令  getfattr  和setfattr  通常也不可用。

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

  • 因此,尝试保留权限的操作(例如  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命令列表,并且实际上可能会失败

command 限制
appendToFile 通常不受支持
checksum 通常的校验和是“无”
chgrp 通常不支持的权限模型;无操作
chmod 通常不支持的权限模型;无操作
chown 通常不支持的权限模型;无操作
createSnapshot 通常不受支持
deleteSnapshot 通常不受支持
df 通常显示默认值
getfacl 可能支持或可能不支持
getfattr 普遍支持
renameSnapshot 通常不受支持
setfacl 通常不受支持的权限模型
setfattr 通常不受支持的权限模型
setrep 没有效果
truncate 通常不受支持

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