您可以在已经创建好的E-MapReduce(简称EMR)集群中,直接使用hadoop fs命令来对HDFS中的文件进行操作。本文为您介绍HDFS的常见命令。
前提条件
在执行任何命令前,请确保已满足以下条件:
命令版本说明
Hadoop提供了两种等效的命令格式来操作文件系统:
- hdfs dfs <args>:这是专门针对HDFS的命令。
- hadoop fs <args>:通用文件系统命令,可以操作HDFS、本地文件系统(- file:///)等多种Hadoop兼容的文件系统。
本文所有示例将统一使用hadoop fs。
命令速查表
下表汇总了HDFS最常用的操作命令,方便快速查找。
| 命令 | 功能 | 常用语法 | 
| 在HDFS中创建新目录。 | 
 | |
| 在HDFS中创建一个大小为0字节的空文件。 | 
 | |
| 查看指定路径下的文件和目录列表及其基本信息。 | 
 | |
| 将本地文件系统(执行命令的EMR节点)上的一个或多个文件复制到HDFS。 | 
 | |
| 将HDFS上的文件或目录复制到本地文件系统(执行命令的EMR节点)。 | 
 | |
| 在HDFS内部复制文件或目录。 | 
 | |
| 在HDFS内部移动或重命名文件/目录。 | 
 | |
| 删除HDFS中的文件或目录。 | 
 | |
| 查看HDFS上文件的内容。 | 
 | |
| 显示文件的大小或者目录中所有文件的大小。 | 
 | 
更多HDFS操作命令,请参见Apache Hadoop官网。
目录与文件管理
mkdir:创建目录
在HDFS中创建新目录。
- 语法 - hadoop fs -mkdir [-p] <paths>
- 参数说明 - -p:沿路径创建所有不存在的父目录,类似于Linux的- mkdir -p。这是生产环境中最常用的参数,可以避免因父目录不存在而导致的错误。
 
- 示例:在HDFS文件系统中,创建/dir目录。 - hadoop fs -mkdir /dir
touchz:创建空文件
在HDFS中创建一个大小为0字节的空文件。
- 语法 - hadoop fs -touchz URI [URI ...]
- 使用场景 - 作为任务处理完成的标记(marker file)。 
- 在执行数据处理前,预先创建一个空的输出文件。 
 
- 示例:在HDFS文件系统/dir/目录下的新建emptyfile.txt文件。 - hadoop fs -touchz /dir/emptyfile.txt
ls:列出文件和目录
查看指定路径下的文件和目录列表及其基本信息。
- 语法 - hadoop fs -ls [-h] [-R] [-t] <args>
- 参数说明 - -h:以人类可读的格式显示文件大小(例如,1K, 234M, 2G)。
- -R:递归列出所有子目录的内容。
- -t:按修改时间排序,最新的文件或目录显示在最前面。
 
- 示例:查看创建的 - dir目录。- hadoop fs -ls /dir
文件传输
put:上传文件到HDFS
将本地文件系统(执行命令的EMR节点)上的一个或多个文件复制到HDFS。
- 语法 - hadoop fs -put [-f] [-p] <localsrc> <dst>
- 参数说明 - -f:强制覆盖目标路径上已存在的文件。
- -p:保留文件的访问和修改时间、所有权和权限。
 
- 示例:上传本地文件hello.txt至HDFS的/dir/sub-dir路径下。 - hadoop fs -put hello.txt /dir/sub-dir
get:从HDFS下载文件
将HDFS上的文件或目录复制到本地文件系统(执行命令的EMR节点)。
- 语法 - hadoop fs -get [-f] [-p] <src> <localdst>
- 参数说明 - -f:强制覆盖目标路径上已存在的文件。
- -p:保留文件的访问和修改时间、所有权和权限。
 
- 示例:复制HDFS文件/dir/emptyfile.txt至本地的/路径下。 - hadoop fs -get /dir/emptyfile.txt /
文件操作
cp:复制文件或目录
在HDFS内部复制文件或目录。
- 语法 - hadoop fs -cp [-f] URI [URI ...] <dest>
- 参数说明 - -f:强制覆盖目标路径上已存在的文件。
 
- 示例:复制/dir/sub-dir/目录下的文件hello_world.txt至/tmp目录下。 - hadoop fs -cp /dir/sub-dir/hello_world.txt /tmp
mv:移动或重命名文件或目录
在HDFS内部移动或重命名文件/目录。这是一个原子操作,在同一文件系统内移动时,数据块不会实际移动,只会更新元数据,速度极快。
- 语法 - hadoop fs -mv URI [URI ...] <dest>
- 示例 - 移动/tmp/目录下的文件hello_world2.txt至/dir/sub-dir/目录下。 - hadoop fs -mv /tmp/hello_world2.txt /dir/sub-dir/
- 移动/tmp/路径下的test目录至/dir/sub-dir/目录下。 - hadoop fs -mv /tmp/test /dir/sub-dir/
 
rm:删除文件或目录
删除HDFS中的文件或目录。
- 语法 - hadoop fs -rm [-f] [-r] [-skipTrash] URI [URI ...]
- 参数说明 - -r:递归删除目录及其所有内容。删除目录时必须使用此参数。
- -f:强制删除。如果文件不存在,命令不会报错。
- -skipTrash:永久删除,跳过回收站。请极度谨慎使用此选项! 默认情况下,删除的文件会移入当前用户的回收站目录(- /user/<username>/.Trash/)。
 
- 示例:删除HDFS系统中/dir/sub-dir/目录下的文件hello_world2.txt。 - hadoop fs -rm /dir/sub-dir/hello_world2.txt
hadoop fs -rmr 命令已被弃用,请使用 hadoop fs -rm -r 命令来递归删除目录。
文件查看
cat:查看文件内容
查看HDFS上文件的内容。
- 语法 - hadoop fs -cat URI [URI ...]
- 示例 - 查看hello.txt文件的内容。 - hadoop fs -cat /hello.txt
- 查看/dir/sub-dir/目录下hello_world.txt文件的内容。 - hadoop fs -cat /dir/sub-dir/hello_world.txt
 
du:显示文件大小
显示文件的大小或者目录中所有文件的大小。
- 语法 - hadoop fs -du [-s] [-h] URI [URI ...]
- 参数说明 - -s:显示总计大小,而不是每个文件/目录的大小。
- -h:以人类可读的格式显示大小。
 
- 示例 - 查看文件的大小。 - hadoop fs -du /hello.txt
- 查看目录下所有文件的大小。 - hadoop fs -du /dir
 
常见问题
- Permission denied- 原因:当前用户没有对目标文件或目录的读/写/执行权限。 
- 解决方案: - 使用 - hdfs dfs -ls <parent_dir>检查文件或其父目录的权限。
- 联系管理员使用 - chmod或- chown授权。
- 如果环境开启了Kerberos,请确认已使用 - kinit获取票据。
 
 
- SafeModeException: NameNode is in safe mode- 原因:NameNode正在启动过程中,处于安全模式,不接受写操作。 
- 解决方案:等待几分钟,NameNode会自动退出安全模式。可使用 - hdfs dfsadmin -safemode get查看状态。非紧急情况不建议手动强制退出。
 
- No such file or directory- 原因:指定的路径不存在。 
- 解决方案:仔细检查路径拼写。如果要写入文件,请确保其父目录已存在,或在 - mkdir时使用- -p参数。
 
- StandbyException: Operation category READ is not supported in state standby- 原因:在HA(高可用)配置中,尝试向处于Standby状态的NameNode发送了读写请求。 
- 解决方案:检查Hadoop配置文件( - core-site.xml),确保- fs.defaultFS指向的是HA的NameService名称(如- hdfs://mycluster),而不是某个具体的NameNode主机名。
 
相关文档
- 如果您的集群开启了高可用,请参见HDFS高可用相关命令(HaAdmin)介绍。 
- 如需在Hadoop集群之间,或在HDFS与对象存储(如OSS)之间迁移数据,请参见Hadoop DistCp介绍。