文章目录
- 前言
- 一、hdfs dfs命令用法
- 二、命令
- 1. 创建目录
- 2. 列出目录内容
- 3. 上传文件到HDFS
- 4. 将本地文件内容追加到HDFS文件中
- 5. 查看文件内容
- 6. 从HDFS下载文件到本地文件系统
- 7. 移动或重命名 HDFS 上的文件
- 8. HDFS上文件复制
- 9. 删除空目录
- 10. 删除文件或目录
- 11. 移动本地文件到 HDFS
- 12. 移动 HDFS 文件到本地
- 13. 搜索文件或目录
- 14. 创建空文件
- 15. 创建空文件或更新现有文件的时间戳
- 16. 截断文件至指定长度
- 17. 统计文件或目录数量
- 18. 修改权限
- 19. 修改所有者和组
- 20. 修改组
- 21. 查看磁盘使用情况
- 22. 查看磁盘空间使用情况
- 22. 设置文件的副本数
- 23. 永久移除被删除的文件
- 24. 测试路径是否存在或具有某些特性
- 25. 以文本形式显示文件内容
- 26. 显示文件或目录的状态
- 27. 合并多个文件并下载
- 28. 创建快照
- 29. 重命名快照
- 30. 删除快照
- 31. 打印文件的校验和信息
- 32. 获取访问控制列表(ACL)
- 33. 设置 ACL
- 34. 设置扩展属性
- 35. 获取扩展属性
前言
Hadoop分布式文件系统(HDFS)是一种基于Java的,设计用于存储和处理大规模数据集的文件系统。由于其可靠性和高效的存储能力,HDFS在大数据处理领域中得到了广泛应用。掌握HDFS的常用命令可以使用户高效地管理和操作文件系统中的数据。
本文将详细介绍HDFS的基本命令和其用法,包括如何创建目录、上传和下载文件、文件管理操作(如移动、重命名和删除)、权限与所有权管理等。通过示例讲解,读者将能够直观理解每个命令的作用及其应用场景,同时附上相关示例。
一、hdfs dfs命令用法
hdfs dfs命令的用法如下:
用法: hdfs dfs [通用选项]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum [-v] <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-v] [-x] <path> ...]
[-expunge [-immediate] [-fs <path>]]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-head <file>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] [-s <sleep interval>] <file>]
[-test -[defswrz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
支持的通用选项有:
-conf <configuration file> 指定应用程序配置文件
-D <property=value> 为给定属性定义一个值
-fs <file:///|hdfs://namenode:port> 指定要使用的默认文件系统URL,从配置中覆盖‘fs.defaultFS’属性。
-jt <local|resourcemanager:port> 指定一个ResourceManager
-files <file1,...> 指定要复制到map reduce集群的文件列表,以逗号分隔
-libjars <jar1,...> 指定要包含在类路径中的以逗号分隔的jar文件列表
-archives <archive1,...> 指定一个由逗号分隔的归档文件列表,这些归档文件将在计算节点上被解压
通用命令行语法为:
command [通用选项] [命令选项]
二、命令
1. 创建目录
1.1 语法及解释
hdfs dfs -mkdir [-p] <hdfs目录路径> ...
-p
:表示创建多级目录。...
:表示可以一次性创建多个目录。
1.2 示例
创建目录/test
。
hdfs dfs -mkdir /test
创建多级目录/test/test01/demo01
。
hdfs dfs -mkdir -p /test/test01/demo01
同时创建多级目录/test/test02/demo02
和/test/test03/demo03
。
hdfs dfs -mkdir -p /test/test02/demo02 /test/test03/demo03
2. 列出目录内容
2.1 语法及解释
hdfs dfs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<hdfs路径> ...]
-C
:只列出文件名或目录名,一行一个,不显示其他信息。-d
:如果目标是一个目录,则只列出该目录本身的信息,而不是其内容。-h
:以人类可读的格式显示文件大小(例如K, M, G等单位)。-q
:在每个文件名中的空格前添加引号,以便处理文件名中有空格的情况。-R
:递归地列出所有子目录的内容。-t
:根据修改时间排序,最近修改的最后显示。加上-r
选项可以反转排序顺序。-S
:根据文件大小排序,最大的最后显示。同样地,加上-r
选项可以反转排序顺序。-r
:反转排序顺序,通常与-t
或-S
一起使用来改变默认的排序方向。-u
:按照访问时间而不是修改时间排序。-e
:显示扩展属性(如果存在)。请注意,不是所有的 Hadoop 版本都支持这个选项。
2.2 示例
列出目录/test
中的文件或目录信息。
hdfs dfs -ls /test
只列出目录/test
中文件名或目录名。
hdfs dfs -ls -C /test
列出目录/test
本身的信息。
hdfs dfs -ls -d /test
以人类可读的格式列出目录/test
中文件或目录的大小。
hdfs dfs -ls -h /test
递归地列出目录/test
中所有子目录的内容。
hdfs dfs -ls -R /test
3. 上传文件到HDFS
3.1 语法及解释
hdfs dfs -copyFromLocal [-f] [-p] [-l] [-d] [-t <线程数>] <Linux本地文件路径> ... <hdfs目录路径>
或
hdfs dfs -put [-f] [-p] [-l] [-d] <Linux本地文件路径> ... <hdfs目录路径>
[-f]
:强制覆盖目标路径上的现有文件。如果不使用-f
选项,而目标路径已经存在同名文件,则命令会失败。[-p]
:保留源文件的属性,包括权限、时间戳等。请注意,用户和组信息可能不会被保留,因为它们取决于具体的用户映射配置。[-l]
:允许符号链接的复制。默认情况下,符号链接会被解析为实际文件或目录进行复制。使用-l
选项时,符号链接本身将被复制到 HDFS 中,而不是它指向的实际内容。[-d]
:如果目标是一个已存在的目录,并且源是多个文件或目录,则此选项会将这些源直接放入目标目录中,而不是在目标目录下创建与源同名的子目录。这在批量上传文件时非常有用。[-t <线程数>]
:指定使用的线程数以并发上传多个文件。增加线程数可以提高上传速度,但也会增加系统资源消耗。请根据您的网络环境和服务器性能调整这个值。
3.2 示例
在Linux本地创建三个文件并添加内容作为演示。
mkdir -p /export/data/demo
echo -e "aaaaaaaaaaa\nbbbbbbbbbbb\nccccccccccccc" >> /export/data/demo/f1.txt
echo -e "ddddddddddd\neeeeeeeeeee\nfffffffffffff" >> /export/data/demo/f2.txt
echo -e "ggggggggggg\nhhhhhhhhhhh\nkkkkkkkkkkkkk" >> /export/data/demo/f3.txt
在hdfs创建目录用于存放上传的文件。
hdfs dfs -mkdir -p /test/demo1 /test/demo2 /test/demo3
把文件/export/data/demo/f1.txt
上传到hdfs的/test/demo1
目录。
hdfs dfs -put /export/data/demo/f1.txt /test/demo1
把文件/export/data/demo/f2.txt
和/export/data/demo/f3.txt
上传到hdfs的/test/demo1
目录。
hdfs dfs -put /export/data/demo/f2.txt /export/data/demo/f3.txt /test/demo1
把文件/export/data/demo/f1.txt
上传到hdfs的/test/demo1
目录,覆盖已经上传的/test/demo1/f1.txt
文件。
hdfs dfs -put -f /export/data/demo/f1.txt /test/demo1
把目录/export/data/demo
中的所有文件覆盖上传到hdfs的/test/demo1
目录。
hdfs dfs -put -f /export/data/demo/* /test/demo1
使用3个线程把目录/export/data/demo
中的所有文件上传到hdfs的/test/demo3
目录。
hdfs dfs -copyFromLocal -t 3 /export/data/demo/* /test/demo3
4. 将本地文件内容追加到HDFS文件中
4.1 语法
hdfs dfs -appendToFile <Linux本地文件路径> ... <hdfs目录路径>
4.2 示例
把文件/export/data/demo/f2.txt
内容追加到hdfs的/test/demo1/f1.txt
文件中。
hdfs dfs -appendToFile /export/data/demo/f2.txt /test/demo1/f1.txt
把文件/export/data/demo/f1.txt
和/export/data/demo/f3.txt
的内容追加到hdfs的/test/demo1/f1.txt
文件中。
hdfs dfs -appendToFile /export/data/demo/f1.txt /export/data/demo/f3.txt /test/demo1/f1.txt
5. 查看文件内容
5.1 语法及解释
hdfs dfs -cat [-ignoreCrc] <hdfs文件路径> ...
hdfs dfs -head <hdfs文件路径>
hdfs dfs -tail [-f] [-s <sleep interval>] <file>
-ignoreCrc
:忽略CRC校验错误。[-f]
:持续输出文件新增加的内容。[-s <sleep interval>]
:与-f
一起使用时,定义程序检查文件更新的频率(以秒为单位)。
5.2 示例
查看hdfs上文件/test/demo1/f1.txt
的内容。
hdfs dfs -cat /test/demo1/f1.txt
查看hdfs上文件/test/demo1/f2.txt
和/test/demo1/f3.txt
的内容。
hdfs dfs -cat /test/demo1/f2.txt /test/demo1/f3.txt
查看hdfs上目录/test/demo1
下所有文件的内容。
hdfs dfs -cat /test/demo1/*
查看hdfs上文件/test/demo1/f1.txt
开头的部分内容。
hdfs dfs -head /test/demo1/f1.txt
查看hdfs上文件/test/demo1/f1.txt
末尾的部分内容。
hdfs dfs -tail /test/demo1/f1.txt
持续查看hdfs上文件/test/demo1/f1.txt
末尾的部分内容。
hdfs dfs -tail -f /test/demo1/f1.txt
6. 从HDFS下载文件到本地文件系统
-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>
:从 HDFS 复制文件到本地文件系统。-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>
:同-copyToLocal
,用于获取文件。
6.1 语法及解释
hdfs dfs -copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <hdfs文件路径> ... <Linux本地目录路径>
或
hdfs dfs -get [-f] [-p] [-ignoreCrc] [-crc] <hdfs文件路径> ... <Linux本地目录路径>
-
-f
:如果本地目标文件已经存在,则强制覆盖它。如果没有这个选项而文件已存在的话,复制操作将会失败。 -
-p
:保留文件的访问时间和修改时间。此外,对于文件,它还会尝试保留权限。 -
-ignoreCrc
:忽略 CRC(循环冗余校验)检查。CRC 检查是一种错误检测机制,用来确保数据在传输过程中没有被损坏。使用此选项时,即使文件的 CRC 校验不匹配也不会导致复制失败。 -
-crc
:同时复制与源文件关联的 CRC 校验文件。
6.2 示例
把hdfs上的/test/demo1/f1.txt
文件下载到Linux本地/tmp
目录下。
hdfs dfs -get /test/demo1/f1.txt /tmp
把hdfs上的/test/demo1/f2.txt
和/test/demo1/f3.txt
文件下载到Linux本地/tmp
目录下。
hdfs dfs -get /test/demo1/f2.txt /test/demo1/f3.txt /tmp
把hdfs上的/test/demo1/f1.txt
文件强制覆盖下载到Linux本地/tmp
目录下。
hdfs dfs -get -f /test/demo1/f1.txt /tmp
7. 移动或重命名 HDFS 上的文件
7.1 语法
-mv <hdfs源目录路径或文件路径> ... <hdfs目标目录路径或文件路径>
7.2 示例
把hdfs上/test/demo1/f1.txt
文件移动到/test/demo2
目录下并重命名为f1_new.txt
文件。
hdfs dfs -mv /test/demo1/f1.txt /test/demo2/f1_new.txt
把hdfs上/test/demo1/f2.txt
和/test/demo1/f3.txt
文件移动到/test/demo2
目录下。
hdfs dfs -mv /test/demo1/f2.txt /test/demo1/f3.txt /test/demo2
把hdfs上/test/demo2
目录下的所有文件或目录移动到/test/demo1
目录下。
hdfs dfs -mv /test/demo2/* /test/demo1
把hdfs上/test/test01
目录移动到/test/test02
目录下。
hdfs dfs -mv /test/test01 /test/test02
8. HDFS上文件复制
8.1 语法及解释
hdfs dfs -cp [-f] [-p | -p[topax]] [-d] <hdfs源路径> ... <hdfs目标路径>
-
-f
:如果目标位置已经存在同名文件或目录,则强制覆盖它。如果不使用此选项而目标位置已存在相同名称的文件或目录,那么命令将会失败。 -
-p
:保留源文件或目录的属性,包括权限(permission)、拥有者(ownership)、时间戳(timestamp),以及扩展属性(extended attributes)。默认情况下,不指定任何参数时,只会保留权限、拥有者和时间戳。 -
-p[topax]
:这是对-p
选项的细化控制。您可以选择性地保留某些属性:t
:保留时间戳(timestamp)。o
:保留拥有者(ownership),前提是执行用户具有相应的权限。p
:保留权限(permission)。x
:保留扩展属性(extended attributes)。
您可以根据需要组合这些字母来指定想要保留的属性。例如,
-pt
将只保留权限和时间戳,而不保留拥有者信息或扩展属性。 -
-d
:允许将非空目录复制到现有目录中。这意味着如果目标是一个现有的非空目录,源目录的内容将被复制到目标目录中,而不是替换目标目录。
8.2 示例
把hdfs上/test/demo1/f1_new.txt
文件复制到/test/demo2
目录下。
hdfs dfs -cp /test/demo1/f1_new.txt /test/demo2
把hdfs上/test/demo1/f1_new.txt
文件复制到/test/demo2
目录下,如果/test/demo2/f1_new.txt文件存在则强制覆盖。
hdfs dfs -cp -f /test/demo1/f1_new.txt /test/demo2
把hdfs上/test/demo1/f2.txt
和/test/demo1/f3.txt
文件复制到/test/demo2
目录下。
hdfs dfs -cp /test/demo1/f2.txt /test/demo1/f3.txt /test/demo2
9. 删除空目录
9.1 语法及解释
hdfs dfs -rmdir [--ignore-fail-on-non-empty] <hdfs目录路径> ...
--ignore-fail-on-non-empty
:这是hdfs dfs -rmdir
命令的一个可选参数。通常情况下,如果你尝试删除一个非空目录(即包含文件或子目录的目录),hdfs dfs -rmdir
将会失败并返回错误信息,因为它默认只允许删除空目录。但是,如果指定了--ignore-fail-on-non-empty
参数,那么即使遇到非空目录,命令也不会报错,而是简单地不删除该目录,并继续处理命令行中指定的其他目录(如果有)。请注意,这并不意味着它会递归地删除目录内容;它只是忽略了删除非空目录时的失败。
9.2 示例
删除hdfs空目录/test/test03/demo02
。
hdfs dfs -rmdir /test/test03/demo02
删除多个hdfs目录时跳过不为空的目录。
hdfs dfs -rmdir --ignore-fail-on-non-empty /test/test03/demo03 /test/test02
10. 删除文件或目录
10.1 语法及解释
hdfs dfs -rm [-f] [-r|-R] [-skipTrash] [-safely] <hdfs文件或目录路径> ...
-
-f
:如果目标文件不存在,忽略错误并继续执行。这在批量删除操作中有用,可以避免因为个别文件不存在而导致整个命令失败。 -
-r
或-R
:递归删除目录及其所有内容(包括子目录和文件)。这两个选项是等价的,允许你删除非空目录。 -
-skipTrash
:直接永久删除文件或目录,而不将它们移入回收站(trash)。默认情况下,HDFS 会把被删除的文件移动到一个临时的回收站目录中,在那里它们可以在一段时间内恢复。使用此选项后,文件将不会进入回收站而是立即被删除。 -
-safely
:这个选项确保删除操作不会导致数据丢失。它会在尝试删除之前检查文件或目录是否可以安全地被删除。例如,它可能会检查是否有其他进程正在使用这些文件或目录。
10.2 示例
删除hdfs上的/test/test03/d.txt
文件。
hdfs dfs -rm /test/test03/d.txt
删除hdfs上多个文件时,忽略不存在的文件。
hdfs dfs -rm -f /test/test03/d.txt /test/test02/demo1/f1_new.txt
递归删除目录/test/test03
及其所有内容。
hdfs dfs -rm -r /test/test03
递归永久删除目录/test/test02
及其所有内容。
hdfs dfs -rm -r -skipTrash /test/test02
安全地删除/test/demo3/demo/f1.txt
文件。
hdfs dfs -rm -safely /test/demo3/demo/f1.txt
11. 移动本地文件到 HDFS
11.1 语法
hdfs dfs -moveFromLocal <Linux本地文件或目录路径> ... <hdfs目录路径>
11.2 示例
在hdfs创建/test/demo
目录,并移动Linux本地/tmp/f1.txt
文件到hdfs的/test/demo
目录下。
hdfs dfs -mkdir /test/demo
hdfs dfs -moveFromLocal /tmp/f1.txt /test/demo
移动Linux本地/tmp/f2.txt
和/tmp/f3.txt
文件到hdfs的/test/demo
目录下。
hdfs dfs -moveFromLocal /tmp/f2.txt /tmp/f3.txt /test/demo
在Linux本地创建/tmp/test
目录,并把/tmp/test
目录移动到hdfs的/test/demo
目录下。
mkdir -p /tmp/test
hdfs dfs -moveFromLocal /tmp/test /test/demo
12. 移动 HDFS 文件到本地
12.1 语法
hdfs dfs -moveToLocal <hdfs路径> <Linux本地路径>
12.2 示例
移动hdfs的/test/demo/f1.txt
文件到Linux本地/tmp
目录。
hdfs dfs -moveToLocal /test/demo/f1.txt /tmp
13. 搜索文件或目录
13.1 语法及解释
hdfs dfs -find <hdfs路径> ... <表达式> ...
<hdfs路径>
:指定要查找的起始目录或文件。可以提供一个或多个路径作为查找的起点。<表达式>
:用于定义查找条件的表达式。表达式可以包含选项、测试和操作,它们决定了哪些文件或目录会被列出。
表达式
表达式是构建查找命令的核心部分,下面是一些常用的表达式及其含义:
-name pattern
:根据文件名模式查找文件。pattern
可以包含通配符(如*
和?
)。-iname pattern
:与-name
类似,但忽略大小写。-size [+|-]n[b|k|m|g]
:根据文件大小查找文件。+
表示大于,-
表示小于;单位为字节 (b
)、千字节 (k
)、兆字节 (m
) 或吉字节 (g
)。-type [f|d|l|...]
:根据类型查找文件。f
表示普通文件,d
表示目录,l
表示符号链接等。-mtime [+|-]n
:根据修改时间查找文件。+n
表示在n
天之前修改的文件,-n
表示在过去n
天内修改的文件。-atime [+|-]n
:根据访问时间查找文件,规则同-mtime
。-exec <command>
:对找到的每个文件执行给定的命令。{}
会替换为当前处理的文件路径,并且通常需要以\;
结尾来标记命令结束。-print
:打印匹配的文件路径。这是默认行为,所以通常不需要显式指定。-and
,-or
,-not
:逻辑运算符,用于组合其他表达式。注意,在某些 Hadoop 版本中,这些逻辑运算符可能需要写成-a
,-o
,!
的形式。
13.2 示例
查找hdfs上/test
目录下所有的f1.txt
文件。
hdfs dfs -find /test -name f1.txt
查找hdfs上/test
和/user
目录下所有的f1.txt
文件。
hdfs dfs -find /test /user -name f1.txt
查找hdfs上跟目录下所有的demo1
目录。
hdfs dfs -find / -name demo1
14. 创建空文件
14.1 语法
hdfs dfs -touchz <hdfs文件路径> ...
14.2 示例
在hdfs上创建空文件/test/test001.txt
。
hdfs dfs -touchz /test/test001.txt
15. 创建空文件或更新现有文件的时间戳
15.1 语法及解释
hdfs dfs -touch [-a] [-m] [-t TIMESTAMP ] [-c] <hdfs文件路径> ...
-
-a
:仅更新访问时间(access time)。如果不提供具体的时间戳,默认使用当前时间。 -
-m
:仅更新修改时间(modification time)。同样地,如果不提供具体的时间戳,默认使用当前时间。 -
-t TIMESTAMP
:允许用户指定要设置的时间戳。TIMESTAMP
必须是一个格式为[YYMMDDhhmm[.ss]]
的字符串。例如,202412201530.45
表示 2024 年 12 月 20 日下午 3 点 30 分 45 秒。这个时间戳可以与-a
或-m
一起使用来精确控制访问或修改时间。 -
-c
:当文件不存在时,不创建新文件。只有在文件已经存在的情况下才会更新时间戳。这与 Unixtouch
命令的行为相匹配,其中-c
选项防止创建新文件。
15.2 示例
在hdfs上创建空文件/test/test002.txt
。
hdfs dfs -touch /test/test002.txt
更新hdfs上/test/test002.txt
文件的访问和修改时间到当前时间。
hdfs dfs -touch /test/test002.txt
更新hdfs上/test/test002.txt
文件的访问时间为当前时间。
hdfs dfs -touch -a /test/test002.txt
更新hdfs上/test/test002.txt
文件的修改时间为当前时间。
hdfs dfs -touch -m /test/test002.txt
16. 截断文件至指定长度
用于在 Hadoop 分布式文件系统 (HDFS) 中截断文件,即减少文件的大小到指定的长度。
16.1 语法及解释
hdfs dfs -truncate [-w] <长度> <hdfs文件路径> ...
-
<长度>
:指定要将文件截断到的目标长度(以字节为单位)。如果提供的长度大于文件当前大小,则操作不会有任何效果;如果小于当前文件大小,文件将被截断至指定长度。 -
-w
:等待(wait)选项。使用-w
选项后,命令将会等待截断操作完成后再返回。如果不使用此选项,命令可能会立即返回,而实际的截断操作可能仍在后台进行。 -
截断操作是不可逆的。一旦文件被截断,丢失的数据将无法恢复,请谨慎使用。
-
如果提供的
<长度>
大于文件的实际大小,那么该命令不会对文件做任何改变。
16.2 示例
截断文件/test/hadoop-env.sh
至长度8000B。
hdfs dfs -truncate 8000 /test/hadoop-env.sh
截断文件/test/hadoop-env_new.sh
至长度8000B,并等待操作完成。
hdfs dfs -truncate -w 8000 /test/hadoop-env.sh
17. 统计文件或目录数量
统计文件的数量、目录数量、空间消耗等。
17.1 语法及解释
hdfs dfs -count [-q] [-h] [-v] [-t [<存储类型>]] [-u] [-x] [-e] <hdfs路径> ...
-
-q
:显示配额(quota)信息。这包括目录树的命名空间配额(namespace quota)、存储空间配额(space quota),以及它们各自的使用情况。 -
-h
:以人类可读的格式显示文件大小(例如 KB, MB, GB)。 -
-v
:显示详细信息,包括每个目录的完整路径名、目录数量、文件数量、文件总字节数、副本总字节数(考虑了文件的复制因子)、压缩后字节数、已用配额百分比等。 -
-t [<存储类型>]
:根据存储类型过滤结果,存储类型可以是DISK
,ARCHIVE
,SSD
等。 -
-u
:显示未完成(under construction)块的数量。这些是正在写入但尚未完成的块。 -
-x
:显示超出配额的文件或目录。这有助于识别哪些路径超过了其命名空间或磁盘空间配额。 -
-e
:显示额外的统计信息,如最小/最大文件大小、平均文件大小等。
17.2 示例
统计目录/test
的目录、文件的数量及总字节数。
hdfs dfs -count /test
统计目录/test
的目录、文件的数量及总字节数,并以人类可读的格式显示大小。
hdfs dfs -count -h /test
统计目录/test
的目录、文件的数量及总字节数,以人类可读的格式显示大小,并显示详细信息。
hdfs dfs -count -h -v /test
统计目录/test
的目录、文件的数量及总字节数,并显示详细的配额信息。
hdfs dfs -count -v -q /test
显示目录/test
下超出配额的文件或目录。
hdfs dfs -count -x -v /test
18. 修改权限
18.1 语法及解释
hdfs dfs -chmod [-R] <MODE[,MODE]... | OCTALMODE> hdfs路径...
更改 Hadoop 分布式文件系统 (HDFS) 中文件或目录的权限。该命令允许用户设置文件或目录的读(read)、写(write)和执行(execute)权限,类似于 Unix/Linux 系统中的 chmod
命令。
-
-R
:递归地更改指定目录及其所有子目录和文件的权限。如果不使用此选项,则只会更改指定文件或目录本身的权限。 -
<MODE[,MODE]...>
或<OCTALMODE>
:权限模式可以通过符号模式或八进制模式来指定。
符号模式 (<MODE[,MODE]...>
)
符号模式允许你以更直观的方式修改权限,格式为 [ugoa][[+-=][rwx]]
,其中:
u
表示用户(文件的所有者)。g
表示组(文件所属的组)。o
表示其他(既不是所有者也不是组成员的用户)。a
表示全部(等同于ugo
的组合)。+
表示添加权限。-
表示移除权限。=
表示设置权限(覆盖现有的权限)。r
表示读取权限。w
表示写入权限。x
表示执行权限。
八进制模式 (<OCTALMODE>
)
八进制模式是一种紧凑的方式来表示权限,通过三个八进制数字来分别设置用户、组和其他的权限。每个八进制数可以是0到7之间的值,对应不同的权限组合:
4
表示读取权限(r)。2
表示写入权限(w)。1
表示执行权限(x)。- 数字相加可以得到多种权限组合,如
7
(即4+2+1
)表示读取、写入和执行权限。
18.2 示例
给hdfs上文件/test/test001.txt
增加权限为所有人可写。
hdfs dfs -chmod a+w /test/test001.txt
设置hdfs上文件/test/test001.txt
的权限为文件所有者有读写权限,组和其他没有任何权限。
hdfs dfs -chmod 600 /test/test001.txt
或
hdfs dfs -chmod u=rw /test/test001.txt
递归的将目录/test/demo3
的权限设置为所有者有读、写、执行权限,组和其他人有读、写权限。
hdfs dfs -chmod -R 766 /test/demo3
19. 修改所有者和组
19.1 语法及解释
hdfs dfs -chown [-R] [OWNER][:[GROUP]] hdfs路径...
hdfs dfs -chown
命令用于更改 Hadoop 分布式文件系统 (HDFS) 中文件或目录的所有者和组。这类似于 Unix/Linux 系统中的 chown
命令,允许用户指定新的所有者和/或组来管理文件或目录的访问权限。以下是该命令中提到的选项参数解释:
-
-R
:递归地更改指定目录及其所有子目录和文件的所有者和/或组。 -
[OWNER][:[GROUP]]
:指定新的所有者和/或组。这里有两种情况:- 如果只提供
OWNER
,那么将仅更改文件或目录的所有者。 - 如果提供
OWNER:GROUP
,那么将同时更改所有者和组。如果只想更改组而不更改所有者,可以使用:GROUP
的格式(即省略所有者部分)。
- 如果只提供
19.2 示例
修改文件/test/test001.txt
的所有者为test
。
hdfs dfs -chown test /test/test001.txt
修改文件/test/test001.txt
的组为testgroup
。
hdfs dfs -chown :testgroup /test/test001.txt
修改文件/test/test001.txt
的所有者为newtest
,组为newtestgroup
。
hdfs dfs -chown newtest:newtestgroup /test/test001.txt
修改目录/test/demo3
的所有者为newtest01
。
hdfs dfs -chown newtest01 /test/demo3
递归的修改目录/test/demo3
及其内容的所有者为newtest
,组为newtestgroup
。
hdfs dfs -chown -R newtest:newtestgroup /test/demo3
20. 修改组
20.1 语法及解释
hdfs dfs -chgrp [-R] GROUP hdfs路径...
-R
:递归地更改指定目录及其所有子目录和文件的组所有权。
GROUP
:指定新的组名称。
20.2 示例
修改文件/test/test002.txt
的所属组为newgroup
。
hdfs dfs -chgrp newgroup /test/test002.txt
递归的修改目录/test/demo3
及其内容的所属组为newgroup
。
hdfs dfs -chgrp -R newgroup /test/demo3
21. 查看磁盘使用情况
21.1 语法及解释
hdfs dfs -du [-s] [-h] [-v] [-x] <hdfs路径> ...
-
-s
:汇总(summarize)。仅显示每个指定路径的总大小,而不是列出每个单独的文件或子目录的大小。 -
-h
:以人类可读的格式显示文件大小(例如 KB, MB, GB)。 -
-v
:显示详细信息(verbose)。 -
-x
:跨过不同文件系统挂载点(cross mount points)。在 HDFS 中,这个选项的意义可能有限,因为 HDFS 是单一命名空间,但如果你有联邦 HDFS 或者其他特殊情况,它可能会有作用。
21.2 示例
查看根目录下磁盘的使用情况。
hdfs dfs -du /
查看根目录下磁盘的使用情况,带有每一列(大小、所有副本消耗的磁盘空间、完整路径名称)的表头。
hdfs dfs -du -v /
查看根目录下磁盘的使用情况,带有每一列(大小、所有副本消耗的磁盘空间、完整路径名称)的表头,并以人类可读的格式显示大小。
hdfs dfs -du -v -h /
查看根目录的使用情况,带有每一列(大小、所有副本消耗的磁盘空间、完整路径名称)的表头,并以人类可读的格式显示大小。
hdfs dfs -du -v -h -s /
22. 查看磁盘空间使用情况
22.1 语法及解释
hdfs dfs -df [-h] [<hdfs路径> ...]
-h
:以人类可读的格式显示文件大小(例如 KB, MB, GB)。
22.2 示例
查看HDFS磁盘空间使用情况(文件系统、大小、已使用空间、可用空间容量、已使用空间百分比)。
hdfs dfs -df
以人类可读的格式查看HDFS磁盘空间使用情况。
hdfs dfs -df -h
以人类可读的格式查看根目录
、/user
目录和/test
目录磁盘空间使用情况。
hdfs dfs -df -h / /user /test
22. 设置文件的副本数
22.1 语法及解释
hdfs dfs -setrep [-R] [-w] <副本数> <hdfs文件路径> ...
-
-R
:递归地更改指定目录及其所有子目录和文件的复制因子。 -
-w
:等待(wait)选项。使用-w
选项后,命令将会等待复制操作完成后再返回。
22.2 示例
设置/test/test001.txt
文件的副本数为3,并等待设置完成后再返回。
hdfs dfs -setrep -w 3 /test/test001.txt
递归的设置/test/demo3
目录下的所有文件的副本数为3,并等待设置完成后再返回。
hdfs dfs -setrep -w -R 3 /test/demo3
23. 永久移除被删除的文件
23.1 语法及解释
hdfs dfs -expunge [-immediate] [-fs <path>]
-
[-immediate]
:立即执行回收站的清空操作,而不等待默认的时间周期(通常是6小时)。使用此选项可以更快地释放磁盘空间。 -
[-fs <path>]
:指定要操作的文件系统的 URI。这通常用于多命名节点环境或多集群环境中,以明确指出要清空哪个文件系统的回收站。如果未指定,则默认为当前配置的默认文件系统。
23.2 示例
清空hdfs的回收站。
hdfs dfs -expunge
立即清空hdfs的回收站。
hdfs dfs -expunge -immediate
清空指定文件系统的回收站。
hdfs dfs -expunge -immediate -fs hdfs://hadoop:9000
24. 测试路径是否存在或具有某些特性
24.1 语法及解释
hdfs dfs -test -[defswrz] <path>
-d
:如果<path>
是一个存在的目录,则返回 0。-e
:如果<path>
存在(无论是文件还是目录),则返回 0。-f
:如果<path>
是一个存在的普通文件,则返回 0。-s
:如果<path>
是一个存在且大小不为零的文件,则返回 0。-w
:如果当前用户对<path>
有写权限,则返回 0。-r
:如果当前用户对<path>
有读权限,则返回 0。-z
:如果<path>
是一个存在且大小为零的文件,则返回 0。
注意事项
hdfs dfs -test
命令本身不会产生任何输出;它只返回一个退出状态码。因此,在实际使用时,通常会结合 shell 的逻辑操作符(如&&
或||
)来执行进一步的操作。
24.2 示例
检查路径/test/demo3
是否是目录。
hdfs dfs -test -d /test/demo3 && echo "是目录"
检查路径/test/demo3
是否存在。
hdfs dfs -test -e /test/demo3 && echo "文件或目录存在"
检查路径/test/test001.txt
是否是普通文件。
hdfs dfs -test -f /test/test001.txt && echo "是普通文件"
检查文件/test/test001.txt
是否为空。
hdfs dfs -test -s /test/test001.txt && echo "文件不为空"
检查文件/test/test001.txt
是否有写权限。
hdfs dfs -test -w /test/test001.txt && echo "有写权限"
检查文件/test/test001.txt
是否有读权限。
hdfs dfs -test -r /test/test001.txt && echo "有读权限"
检查文件是否为空
hdfs dfs -test -z /test/test001.txt && echo "文件为空"
25. 以文本形式显示文件内容
25.1 语法及解释
hdfs dfs -text [-ignoreCrc] <hdfs文件路径> ...
-ignoreCrc
:忽略 CRC(循环冗余校验)检查。CRC 检查是一种错误检测机制,用来确保数据在传输过程中没有被损坏。使用此选项时,即使文件的 CRC 校验不匹配也不会导致命令失败,而是继续尝试显示文件内容。这对于尝试查看可能已损坏但仍部分可读的文件特别有用。
25.2 示例
以文本形式显示/test/hadoop-env.sh
文件内容。
hdfs dfs -text /test/hadoop-env.sh
26. 显示文件或目录的状态
26.1 语法及解释
hdfs dfs -stat [format] <hdfs路径> ...
[format]
:可选参数,用于指定输出格式。
格式说明符%a
:访问权限(例如755
或644
)。%b
:分配给文件的实际块数。%d
:设备编号(通常不适用于 HDFS)。%g
:组 ID。%G
:组名称。%i
:inode 编号(通常不适用于 HDFS)。%m
:挂载点(通常不适用于 HDFS)。%n
:文件名。%N
:带有符号链接的目标文件名。%s
:文件大小(以字节为单位)。%t
:文件类型(例如-
表示普通文件,d
表示目录)。%u
:用户 ID。%U
:用户名。%w
:上次访问时间(以秒为单位,自纪元以来)。%x
:上次数据修改时间(以秒为单位,自纪元以来)。%y
:上次状态改变时间(以秒为单位,自纪元以来)。%z
:上次同步到磁盘的时间(以秒为单位,自纪元以来)。
26.2 示例
显示文件/test/demo3/f1.txt
的状态。
hdfs dfs -stat "%a %b %d %g %n %u" /test/demo3/f1.txt
27. 合并多个文件并下载
27.1 语法及解释
hdfs dfs -getmerge [-nl] [-skip-empty-file] <hdfs目录路径> <Linux本地文件路径>
-nl
:在每个文件内容之后添加一个换行符(newline)。这对于确保合并后的文件格式正确特别有用,特别是当源文件本身没有以换行符结尾时。
-skip-empty-file
:跳过空文件,不将它们包含在合并结果中。这可以避免合并文件中出现不必要的空白部分。
27.2 示例
合并hdfs上目录/test/demo1
下的所有文件并下载到Linux本地。
hdfs dfs -getmerge /test/demo1 /export/data/mergedfile.txt
合并hdfs上目录/test/demo1
下的所有文件并下载到Linux本地,在每个文件后添加换行符,并跳过空文件。
hdfs dfs -getmerge -nl -skip-empty-file /test/demo1 /export/data/mergedfile.txt
28. 创建快照
28.1 语法
hdfs dfs -createSnapshot <快照目录> [<快照名称>]
28.2 示例
创建保存快照的目录,启用快照功能,并创建默认名称的快照。
hdfs dfs -mkdir /snapshot
hdfs dfsadmin -allowSnapshot /snapshot
hdfs dfs -createSnapshot /snapshot
创建快照并指定名称为my_snapshot_202412220025
。
hdfs dfs -createSnapshot /snapshot my_snapshot_202412220025
29. 重命名快照
29.1 语法
hdfs dfs -renameSnapshot <快照目录> <旧快照名称> <新快照名称>
29.2 示例
hdfs dfs -renameSnapshot /snapshot my_snapshot_202412220025 new_my_snapshot_202412220025
30. 删除快照
30.1 语法
hdfs dfs -deleteSnapshot <快照目录> <快照名称>
30.2 示例
hdfs dfs -deleteSnapshot /snapshot new_my_snapshot_202412220025
31. 打印文件的校验和信息
31.1 语法
hdfs dfs -checksum [-v] <src> ...
-v
:详细模式(verbose)。使用此选项时,命令不仅会显示每个文件的校验和信息,还会提供额外的细节,如算法类型、块大小等。
31.2 示例
打印文件/test/test001.txt
的校验和信息。
hdfs dfs -checksum /test/test001.txt
打印多个文件的校验和信息。
hdfs dfs -checksum /test/test001.txt /test/test002.txt /test/demo1/f2.txt
打印多个文件的校验和信息,并显示块大小。
hdfs dfs -checksum -v /test/test001.txt /test/test002.txt /test/demo1/f2.txt
32. 获取访问控制列表(ACL)
32.1 语法
hdfs dfs -getfacl [-R] <hdfs路径>
-R
:递归地显示指定目录及其所有子目录和文件的 ACL 信息。
32.2 示例
查看文件/test/test001.txt
的 ACL 信息。
hdfs dfs -getfacl /test/test001.txt
查看目录/test/demo3
的 ACL 信息。
hdfs dfs -getfacl /test/demo3
递归的查看目录/test/demo3
及其内容的 ACL 信息。
hdfs dfs -getfacl -R /test/demo3
33. 设置 ACL
33.1 语法
hdfs dfs -setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]
-
-R
:递归地应用 ACL 设置到指定目录及其所有子目录和文件。如果不使用此选项,则只会更改指定文件或目录本身的 ACL。 -
{-b|-k}
:-b
:移除所有扩展 ACL 条目,并清除默认 ACL。-k
:仅移除默认 ACL。
-
{-m|-x <acl_spec>}
:-m
:修改 ACL,添加新的条目或更新现有条目。-x
:删除指定的 ACL 条目。
-
<acl_spec>
:ACL 规格字符串,定义要设置或修改的具体 ACL 条目。格式如下:- 用户条目:
user[:<username>]:<permissions>
- 组条目:
group[:<groupname>]:<permissions>
- 其他条目:
other::<permissions>
- 默认用户条目:
default:user[:<username>]:<permissions>
- 默认组条目:
default:group[:<groupname>]:<permissions>
- 默认其他条目:
default:other::<permissions>
其中
<permissions>
可以是r
(读)、w
(写)、x
(执行)以及它们的组合,如rwx
或r-x
。 - 用户条目:
-
--set <acl_spec>
:完全替换现有的 ACL 列表(包括默认 ACL),并设置新的 ACL。这会覆盖所有的现有条目。
34. 设置扩展属性
扩展属性允许你为文件或目录附加额外的元数据,这对于存储和检索与文件内容无关的信息非常有用。
34.1 语法
hdfs dfs -setfattr {-n name [-v value] | -x name} <hdfs路径>
{-n name [-v value] | -x name}
:-n name
:指定要创建或修改的扩展属性名称。[-v value]
:指定要设置的扩展属性值。如果省略此选项,则会将该扩展属性的值设置为空。
-x name
:指定要删除的扩展属性名称。
34.2 示例
给文件/test/test001.txt
设置扩展属性。
hdfs dfs -setfattr -n user.comment -v "This is a comment" /test/test001.txt
给文件/test/test001.txt
设置没有值的扩展属性。
hdfs dfs -setfattr -n user.flag /test/test001.txt
删除文件/test/test001.txt
的特定扩展属性。
hdfs dfs -setfattr -x user.flag /test/test001.txt
35. 获取扩展属性
35.1 语法
hdfs dfs -getfattr [-R] {-n name | -d} [-e en] <hdfs路径>
-
-R
:递归地显示指定目录及其所有子目录和文件的扩展属性信息。如果不使用此选项,则只会显示指定文件或目录本身的扩展属性信息。 -
{-n name | -d}
:-n name
:指定要获取的扩展属性名称。你可以通过这个选项来获取特定名称的扩展属性值。-d
:显示所有默认扩展属性。这将列出文件或目录上设置的所有扩展属性及其值。
-
[-e en]
:指定编码方式。如果扩展属性的值不是简单的文本字符串,可以使用此选项来指定如何解码这些值。常见的编码方式包括:text
:以文本格式显示。hex
:以十六进制格式显示。base64
:以 Base64 编码格式显示。
35.2 示例
获取文件文件/test/test001.txt
的特定扩展属性。
hdfs dfs -getfattr -n user.comment /test/test001.txt
递归地获取/test/demo3
目录及其内容的所有扩展属性。
hdfs dfs -getfattr -R -d /test/demo3