💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
💝💝💝如有需要请大家订阅我的专栏【大数据系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!
文章目录
-
- 引言
- 一、命令使用前须知
-
- [1.1 两种命令风格](#1.1 两种命令风格)
- [1.2 命令通用格式](#1.2 命令通用格式)
- [1.3 获取帮助](#1.3 获取帮助)
- [1.4 环境准备示例](#1.4 环境准备示例)
- 二、核心命令分类总览
- 三、上传命令:将数据写入HDFS
-
- [3.1 put:从本地复制到HDFS](#3.1 put:从本地复制到HDFS)
- [3.2 copyFromLocal:put的别名](#3.2 copyFromLocal:put的别名)
- [3.3 moveFromLocal:上传后删除本地源](#3.3 moveFromLocal:上传后删除本地源)
- [3.4 appendToFile:追加内容到已有文件](#3.4 appendToFile:追加内容到已有文件)
- [3.5 上传命令对比](#3.5 上传命令对比)
- 四、下载命令:从HDFS读取数据
-
- [4.1 get:从HDFS复制到本地](#4.1 get:从HDFS复制到本地)
- [4.2 copyToLocal:get的别名](#4.2 copyToLocal:get的别名)
- [4.3 getmerge:合并下载](#4.3 getmerge:合并下载)
- [4.4 text:查看文本内容(支持压缩)](#4.4 text:查看文本内容(支持压缩))
- 五、删除命令:清理无用数据
-
- [5.1 rm:删除文件或目录](#5.1 rm:删除文件或目录)
- [5.2 rmdir:删除空目录](#5.2 rmdir:删除空目录)
- [5.3 expunge:清空回收站](#5.3 expunge:清空回收站)
- 六、权限设置命令:安全管控
-
- [6.1 chmod:修改权限](#6.1 chmod:修改权限)
- [6.2 chown:修改所有者](#6.2 chown:修改所有者)
- [6.3 chgrp:修改所属组](#6.3 chgrp:修改所属组)
- [6.4 高级权限:ACL(访问控制列表)](#6.4 高级权限:ACL(访问控制列表))
- [6.5 权限相关查看命令](#6.5 权限相关查看命令)
- 七、常用辅助命令
-
- [7.1 目录与文件操作](#7.1 目录与文件操作)
- [7.2 磁盘与统计](#7.2 磁盘与统计)
- [7.3 文件校验与查找](#7.3 文件校验与查找)
- 八、实战场景:综合案例
- 九、常见错误与排障
- 十、命令速查表
- 十一、总结
引言
在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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙