HDFS 常用命令大全:从入门到生产实战

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

💝💝💝如有需要请大家订阅我的专栏【大数据系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

文章目录

引言

在Hadoop生态中,HDFS是存储基石。无论你是数据开发、运维还是架构师,熟练掌握HDFS命令行操作都是必备技能。本文将系统讲解HDFS的常用命令,涵盖上传、下载、删除、权限设置等核心操作,每个命令都配有实战案例和代码示例,让你看完就能上手。

一、命令使用前须知

1.1 两种命令风格

Hadoop提供了两套命令,功能完全一致,任选其一即可:

命令前缀 特点
hadoop fs 通用文件系统命令,可操作任何Hadoop支持的文件系统(HDFS、本地文件等)
hdfs dfs HDFS专用命令,仅操作HDFS,性能略优

本文统一使用 hdfs dfs 风格。

1.2 命令通用格式

bash 复制代码
hdfs dfs -命令 [选项] [参数]

1.3 获取帮助

bash 复制代码
# 查看所有命令
hdfs dfs

# 查看具体命令用法
hdfs dfs -help put
hdfs dfs -usage ls

1.4 环境准备示例

在开始之前,确保HDFS集群正常运行(单节点或分布式均可),并创建一个测试目录:

bash 复制代码
# 查看HDFS状态
hdfs dfsadmin -report

# 创建测试根目录
hdfs dfs -mkdir -p /test/data
hdfs dfs -mkdir /test/upload
hdfs dfs -mkdir /test/download

二、核心命令分类总览

类别 常用命令
上传 put, copyFromLocal, moveFromLocal, appendToFile
下载 get, copyToLocal, getmerge, text
删除 rm, rmdir, expunge
权限 chmod, chown, chgrp, setfacl, getfacl
目录/文件操作 ls, mkdir, touchz, cp, mv, du, df, stat
查看内容 cat, head, tail
HDFS管理 fsck, balancer, dfsadmin

三、上传命令:将数据写入HDFS

3.1 put:从本地复制到HDFS

最常用的上传命令,将本地文件或目录复制到HDFS。

bash 复制代码
# 基本语法
hdfs dfs -put <本地源路径> <HDFS目标路径>

# 上传单个文件
hdfs dfs -put /home/user/logs/access.log /test/data/

# 上传多个文件
hdfs dfs -put file1.txt file2.txt /test/data/

# 上传整个目录
hdfs dfs -put /home/user/logs/ /test/upload/

# 覆盖已存在的文件(使用-f)
hdfs dfs -put -f /home/user/config.xml /test/data/config.xml

# 显示上传进度(使用-v)
hdfs dfs -put -v largefile.dat /test/upload/

实际案例:批量上传日志文件

bash 复制代码
# 生成测试文件
echo "2025-01-01 10:00:00 ERROR" > /tmp/error.log
echo "2025-01-01 10:00:01 INFO" > /tmp/info.log
echo "2025-01-01 10:00:02 WARN" > /tmp/warn.log

# 批量上传
hdfs dfs -put /tmp/*.log /test/logs/

# 验证上传结果
hdfs dfs -ls /test/logs/

3.2 copyFromLocal:put的别名

用法与 put 完全相同,只是名字更具描述性。

bash 复制代码
hdfs dfs -copyFromLocal /etc/hosts /test/data/hosts_backup

3.3 moveFromLocal:上传后删除本地源

上传后自动删除本地源文件,相当于"剪切"操作。

bash 复制代码
hdfs dfs -moveFromLocal /tmp/temp_data.csv /test/upload/

# 查看本地文件是否还在(应该不存在)
ls /tmp/temp_data.csv

3.4 appendToFile:追加内容到已有文件

将本地文件内容追加到HDFS已有文件末尾。

bash 复制代码
# 准备追加内容
echo "new line content" > /tmp/append.txt

# 追加到HDFS文件
hdfs dfs -appendToFile /tmp/append.txt /test/data/access.log

# 查看追加结果
hdfs dfs -cat /test/data/access.log

3.5 上传命令对比

命令 本地源文件是否保留 支持目录 覆盖控制
put -f 参数
copyFromLocal -f 参数
moveFromLocal
appendToFile 是(仅文件) 追加模式

四、下载命令:从HDFS读取数据

4.1 get:从HDFS复制到本地

最常用的下载命令,将HDFS文件或目录复制到本地文件系统。

bash 复制代码
# 基本语法
hdfs dfs -get <HDFS源路径> <本地目标路径>

# 下载单个文件
hdfs dfs -get /test/data/access.log /home/user/

# 下载时重命名
hdfs dfs -get /test/data/access.log /home/user/log_backup.log

# 下载目录(递归)
hdfs dfs -get /test/logs /home/user/local_logs/

# 忽略校验和错误(-ignoreCrc)
hdfs dfs -get -ignoreCrc /corrupted/file /tmp/recovery/

# 下载多个文件
hdfs dfs -get /test/data/file1.txt /test/data/file2.txt /home/user/

实际案例:下载并保留原属性

bash 复制代码
# -p 参数保留原文件的权限、时间戳等属性
hdfs dfs -get -p /test/data/important.dat /backup/

# 查看本地文件属性
ls -l /backup/important.dat

4.2 copyToLocal:get的别名

get 功能完全相同。

bash 复制代码
hdfs dfs -copyToLocal /test/data/access.log /tmp/

4.3 getmerge:合并下载

将HDFS目录下的多个文件合并成一个本地文件下载,非常适合日志聚合场景。

bash 复制代码
# 基本语法
hdfs dfs -getmerge <HDFS目录路径> <本地目标文件>

# 合并目录下所有文件
hdfs dfs -getmerge /test/logs /tmp/all_logs.txt

# 合并时在每个文件内容前加上文件名(-nl)
hdfs dfs -getmerge -nl /test/logs /tmp/logs_with_filenames.txt

# 跳过空文件(-skip-empty)
hdfs dfs -getmerge -skip-empty /test/logs /tmp/non_empty.txt

实际案例:合并分区日志

bash 复制代码
# 假设HDFS上按日期分区的日志
# /logs/dt=2025-01-01/part-0000
# /logs/dt=2025-01-01/part-0001
# /logs/dt=2025-01-02/part-0000

# 合并2025-01-01的所有日志
hdfs dfs -getmerge /logs/dt=2025-01-01 /tmp/2025-01-01.log

# 合并所有日期的日志,带文件名标记
hdfs dfs -getmerge -nl /logs /tmp/all_logs_tagged.log

4.4 text:查看文本内容(支持压缩)

text 命令可以查看HDFS文件内容,并且自动解压压缩文件(如.gz、.bz2等)。

bash 复制代码
# 查看普通文本文件
hdfs dfs -text /test/data/access.log

# 查看gzip压缩文件
hdfs dfs -text /test/data/access.log.gz

# 只查看前10行
hdfs dfs -text /test/data/access.log.gz | head -10

# 统计行数
hdfs dfs -text /test/data/access.log.gz | wc -l

五、删除命令:清理无用数据

5.1 rm:删除文件或目录

bash 复制代码
# 基本语法
hdfs dfs -rm <HDFS路径>

# 删除单个文件
hdfs dfs -rm /test/data/temp.txt

# 删除目录(需要 -r 递归)
hdfs dfs -rm -r /test/old_data/

# 删除多个文件(支持通配符)
hdfs dfs -rm /test/logs/error*.log

# 跳过回收站(-skipTrash),直接永久删除
hdfs dfs -rm -skipTrash /test/critical/temp.dat

# 显示删除详情(-verbose)
hdfs dfs -rm -r -verbose /test/backup/

实际案例:清理7天前的旧数据

bash 复制代码
# 使用通配符删除旧分区
hdfs dfs -rm -r /logs/dt=2025-01-0[1-7]/

5.2 rmdir:删除空目录

只能删除空目录,非空目录会报错,更安全。

bash 复制代码
# 删除空目录
hdfs dfs -rmdir /test/empty_folder

# 删除多个空目录
hdfs dfs -rmdir /test/dir1 /test/dir2

# 尝试删除非空目录(会失败)
hdfs dfs -rmdir /test/logs  # 报错: Directory is not empty

5.3 expunge:清空回收站

HDFS默认将删除的文件移入回收站(/user/用户名/.Trash),expunge 命令可永久清空回收站。

bash 复制代码
# 清空当前用户的回收站
hdfs dfs -expunge

# 查看回收站内容(相当于Linux的ls)
hdfs dfs -ls /user/$(whoami)/.Trash/Current/

# 手动从回收站恢复文件
hdfs dfs -mv /user/hadoop/.Trash/Current/test/important.txt /test/

⚠️ 注意 :回收站功能需要配置启用,默认在core-site.xml中设置fs.trash.interval(单位分钟)。

六、权限设置命令:安全管控

HDFS的权限模型与Linux/POSIX类似,采用**用户(u) + 组(g) + 其他(o)**的三层权限,每个文件/目录有读®、写(w)、执行(x)权限。

符号 数字 权限 对目录的含义
r 4 列出目录内容
w 2 创建/删除子文件或子目录
x 1 执行 访问目录下的子项

6.1 chmod:修改权限

bash 复制代码
# 基本语法(与Linux chmod一致)
hdfs dfs -chmod <权限> <HDFS路径>

# 数字方式:755 = rwxr-xr-x
hdfs dfs -chmod 755 /test/data

# 符号方式:u+rwx,g+rx,o+rx
hdfs dfs -chmod u+rwx,g+rx,o+rx /test/data

# 递归修改目录下所有文件(-R)
hdfs dfs -chmod -R 750 /test/important/

# 去掉其他用户的写权限
hdfs dfs -chmod o-w /test/shared/

# 设置粘滞位(只有文件所有者才能删除)
hdfs dfs -chmod 1777 /tmp

实际案例:为部门共享目录设置权限

bash 复制代码
# 创建部门共享目录
hdfs dfs -mkdir /data/sales

# 设置权限:所有者读写执行,组读写,其他无权限
hdfs dfs -chmod 770 /data/sales

# 验证
hdfs dfs -ls -d /data/sales

6.2 chown:修改所有者

bash 复制代码
# 基本语法
hdfs dfs -chown <新所有者> <HDFS路径>

# 修改文件所有者为hdfs用户
hdfs dfs -chown hdfs /test/data/access.log

# 同时修改所有者和所属组(用冒号分隔)
hdfs dfs -chown hdfs:hadoop /test/data/

# 递归修改(-R)
hdfs dfs -chown -R hive:hive /user/hive/warehouse/

# 仅修改组(用冒号后面为空)
hdfs dfs -chown :hadoop /test/shared/

6.3 chgrp:修改所属组

bash 复制代码
# 基本语法
hdfs dfs -chgrp <新组名> <HDFS路径>

# 修改文件所属组
hdfs dfs -chgrp hadoop /test/data/access.log

# 递归修改
hdfs dfs -chgrp -R analytics /data/reports/

6.4 高级权限:ACL(访问控制列表)

当基础权限不够用时,ACL可以为特定用户或组设置更细粒度的权限。

bash 复制代码
# 启用ACL功能(需在hdfs-site.xml配置)
# <property><name>dfs.namenode.acls.enabled</name><value>true</value></property>

# 查看ACL
hdfs dfs -getfacl /test/secure/

# 设置ACL:给用户alice读写权限
hdfs dfs -setfacl -m user:alice:rw- /test/secure/

# 设置ACL:给组qa读权限
hdfs dfs -setfacl -m group:qa:r-- /test/secure/

# 删除特定用户的ACL条目
hdfs dfs -setfacl -x user:alice /test/secure/

# 删除所有ACL,恢复基础权限
hdfs dfs -setfacl -b /test/secure/

ACL实战案例:多团队协作目录

bash 复制代码
# 创建项目目录
hdfs dfs -mkdir /project/x

# 基础权限:所有者root完全控制,组project读写,其他人无
hdfs dfs -chmod 770 /project/x
hdfs dfs -chown root:project /project/x

# 给外包团队的特定用户只读权限
hdfs dfs -setfacl -m user:vendor1:r-- /project/x

# 给审计组特殊写入权限
hdfs dfs -setfacl -m group:audit:rwx /project/x

# 查看最终权限
hdfs dfs -getfacl /project/x

6.5 权限相关查看命令

bash 复制代码
# 查看文件详细信息(包含权限、所有者等)
hdfs dfs -ls -h /test/data/
# 输出示例:-rw-r--r--   3 hadoop supergroup    128M  2025-01-15 10:00 /test/data/file.bin

# 查看目录摘要信息
hdfs dfs -ls -d /test/data/

# 统计目录下文件数量、大小、权限汇总
hdfs dfs -count /test/data/

七、常用辅助命令

7.1 目录与文件操作

bash 复制代码
# 创建目录(-p 自动创建父目录)
hdfs dfs -mkdir -p /user/hadoop/input/2025/01

# 创建空文件
hdfs dfs -touchz /test/empty_file.txt

# 复制文件
hdfs dfs -cp /test/source.txt /test/dest/

# 移动/重命名文件
hdfs dfs -mv /test/old_name.txt /test/new_name.txt

# 查看文件最后1KB(字节)
hdfs dfs -tail /test/logs/access.log

# 查看文件前几行(通过管道)
hdfs dfs -cat /test/logs/access.log | head -20

7.2 磁盘与统计

bash 复制代码
# 查看HDFS总容量、已用、可用
hdfs dfs -df -h /

# 查看目录实际占用空间
hdfs dfs -du -h /test/data/

# 按大小排序显示(需要辅助命令)
hdfs dfs -du /test/ | sort -rn

# 汇总目录总大小
hdfs dfs -du -s -h /test/data/

# 查看文件/目录的元数据(修改时间、块信息等)
hdfs dfs -stat "%n - %b bytes, modified %y" /test/data/file.txt

7.3 文件校验与查找

bash 复制代码
# 计算文件的MD5值
hdfs dfs -checksum /test/data/file.txt

# 查找符合条件的文件(使用通配符)
hdfs dfs -find /test/logs -name "*.log"

# 查找超过7天的文件(需要结合shell)
hdfs dfs -ls -R /test/logs | grep -E "2025-01-0[1-7]" | awk '{print $8}'

八、实战场景:综合案例

场景一:数据ETL全流程

假设我们需要从本地采集日志,上传到HDFS,清理旧数据,然后下载分析结果。

bash 复制代码
# 1. 准备本地数据
ls -lh /data/raw/*.csv

# 2. 创建HDFS日期分区目录
hdfs dfs -mkdir -p /staging/orders/dt=2025-01-15

# 3. 上传数据(带进度)
hdfs dfs -put -v /data/raw/orders_20250115.csv /staging/orders/dt=2025-01-15/

# 4. 删除7天前的旧分区
hdfs dfs -rm -r /staging/orders/dt=2025-01-08/

# 5. 确认数据已上传
hdfs dfs -ls -R /staging/orders/

# 6. 假设经过Spark等处理后,结果在HDFS的/output目录
# 将结果合并下载到本地
hdfs dfs -getmerge -nl /output/result /home/analyst/result.txt

# 7. 清理临时文件
hdfs dfs -rm -r /staging/orders/dt=2025-01-15/_temporary

场景二:多用户协作共享目录

bash 复制代码
# 1. 创建团队共享目录
hdfs dfs -mkdir /share/analytics

# 2. 设置权限:团队读写,其他人无权限
hdfs dfs -chmod 770 /share/analytics
hdfs dfs -chown root:analytics /share/analytics

# 3. 添加特殊用户只读
hdfs dfs -setfacl -m user:data_audit:r-x /share/analytics

# 4. 创建子目录,并单独设置权限
hdfs dfs -mkdir /share/analytics/restricted
hdfs dfs -chmod 700 /share/analytics/restricted
hdfs dfs -chown analytic_lead:analytics /share/analytics/restricted

# 5. 验证权限
hdfs dfs -ls -ld /share/analytics
hdfs dfs -getfacl /share/analytics

场景三:定期维护脚本

bash 复制代码
#!/bin/bash
# hdfs_maintenance.sh - HDFS日常维护脚本

# 设置变量
BACKUP_DIR="/backup/daily"
LOG_FILE="/var/log/hdfs_cleanup.log"

echo "$(date) - Starting HDFS maintenance" >> $LOG_FILE

# 1. 清理超过30天的临时数据
hdfs dfs -rm -r -skipTrash /tmp/hive_* 2>> $LOG_FILE

# 2. 清空回收站
hdfs dfs -expunge 2>> $LOG_FILE

# 3. 检查欠副本块
UNDER_REP=$(hdfs fsck / | grep "Under replicated blocks" | awk '{print $4}')
echo "$(date) - Under replicated blocks: $UNDER_REP" >> $LOG_FILE

# 4. 检查磁盘使用率
hdfs dfs -df -h / >> $LOG_FILE

# 5. 运行均衡器(若差异超过10%)
hdfs balancer -threshold 10 2>> $LOG_FILE

echo "$(date) - Maintenance completed" >> $LOG_FILE

场景四:数据迁移

bash 复制代码
# 在HDFS内部移动数据
hdfs dfs -mv /staging/old_data /archive/2024/

# 跨集群复制(使用distcp)
hadoop distcp hdfs://source-cluster:8020/data/orders \
                 hdfs://target-cluster:8020/backup/orders

# 压缩并归档旧数据(创建Hadoop归档文件)
hadoop archive -archiveName logs_2024.har -p /logs/2024 /archives/

九、常见错误与排障

错误信息 常见原因 解决方案
Permission denied 权限不足 检查当前用户权限,使用chmod/chown修改或切换到有权限的用户
File already exists 目标文件已存在 使用-f参数覆盖,或先删除再上传
No such file or directory 路径不存在 检查路径拼写,使用ls确认父目录存在
Could only be replicated to 0 nodes 无可用DataNode 检查DataNode是否启动,磁盘是否满
Name node is in safe mode NameNode处于安全模式 等待自动退出,或强制hdfs dfsadmin -safemode leave
Operation not permitted 操作不允许 如删除非空目录需加-r,移动跨文件系统需用-p
Checksum mismatch 数据损坏 -ignoreCrc尝试恢复,或从其他副本重新复制

十、命令速查表

操作 命令示例
查看文件列表 hdfs dfs -ls /path
创建目录 hdfs dfs -mkdir -p /path
上传文件 hdfs dfs -put local.txt /hdfs/
下载文件 hdfs dfs -get /hdfs/file.txt local/
删除文件 hdfs dfs -rm /hdfs/file
删除目录 hdfs dfs -rm -r /hdfs/dir
重命名 hdfs dfs -mv /old /new
复制 hdfs dfs -cp /src /dst
查看内容 hdfs dfs -cat /hdfs/file
修改权限 hdfs dfs -chmod 755 /hdfs/file
修改所有者 hdfs dfs -chown user:group /hdfs/file
查看磁盘用量 hdfs dfs -du -h /path
查看集群容量 hdfs dfs -df -h /
设置副本数 hdfs dfs -setrep 3 /path
测试文件存在 hdfs dfs -test -e /path && echo exists
统计目录信息 hdfs dfs -count /path
合并下载 hdfs dfs -getmerge /hdfs/dir /local/merged.txt
清空回收站 hdfs dfs -expunge

十一、总结

HDFS命令行是操作大数据存储的基本功。本文涵盖了从基础的put/get到进阶的-setfacl-getmerge等命令,每个都配有实际案例。掌握这些命令后,你将能够:

  • 高效管理数据:批量上传、下载、合并,处理TB级文件
  • 保障数据安全:精细的权限控制和ACL,满足企业合规要求
  • 自动化运维:结合shell脚本实现日常清理、监控和告警
  • 排查故障:快速定位权限、空间、副本等问题

记住:熟练使用命令行是成为Hadoop专家的第一步 。建议你在自己的测试集群上亲自敲一遍这些命令,遇到问题多查看-help,日积月累,必有所成。


你在生产环境中遇到过哪些HDFS命令引发的问题?比如误删数据、权限配置错误等。欢迎在评论区分享你的经验,让更多人避坑~

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
code 小楊2 小时前
最新快乐马视频模型深度解析:特性、对比测试与完整使用教程
大数据·人工智能·音视频
璞华Purvar2 小时前
投后管理系统全解析:核心功能、应用场景与落地价值(2026年)
大数据·人工智能·物联网
Elastic 中国社区官方博客2 小时前
Elasticsearch:智能搜索 - AI builder,workflow 及 skills
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Young soul22 小时前
Elasticsearch(v8.5) 常用操作大全
大数据·elasticsearch·jenkins
乐迪信息2 小时前
乐迪信息:精准识别每一艘船:船舶AI类型分类算法技术解析
大数据·人工智能·物联网·安全·目标跟踪·分类·数据挖掘
橘颂TA18 小时前
【Linux】读写锁
大数据·linux·开发语言·c++·读写锁
SelectDB19 小时前
Apache Doris 4.1:面向 AI & Search 的统一数据存储与检索底座
大数据·数据库·数据分析
陈天伟教授19 小时前
GPT Image 2-勾股定理
大数据·数据库·人工智能·gpt
Elastic 中国社区官方博客20 小时前
在 Discover 中探索来自新的时间序列数据流的指标
大数据·数据库·目标检测·elasticsearch·搜索引擎·数据分析·全文检索