hdfs的一个运维小技巧

【前言】

对于hdfs而言,磁盘故障的处理或者节点的扩容是比较常见的运维操作。对于这种场景的运维操作是相对比较简单的,但关键在于如何快速的使数据在各个dn之间平衡,或者快速的使block数据达到指定的副本数,本文就来聊聊这个小技巧。

【块平衡】

在hdfs的实际使用过程中,难免会遇到DN的异常停止服务的时候。在这种情况下,当NN检测到DN处于异常后,为保证数据满足指定的副本数,因此会逐步为该DN上的所有block,选择新的DN节点,并完成block数据的拷贝,那么长时间运行后,各个DN的磁盘容量就会出现不一致的情况,或者说会有较大的差距。

另外一个比较典型的场景,就是对DN进行扩容。扩容后,新DN上是没有数据的。

对于这两种场景,我们可能会期望将磁盘使用率较高的节点中的一部分数据迁移到其他DN节点中,保证各个DN磁盘容量在一个较平衡的水平。因此,我们可以通过hdfs自带的命令,完成各个DN之间磁盘容量的平衡。

具体命令的使用如下所示:

hdfs balancer –threshold 10 –idleiterations 5
# 参数说明:
# -threshold:datanode之间磁盘使用率的相差阈值,取值范围0-100
# -idleiterations:迭代次数,默认为5(即连续5次迭代都没有需要移动的block,则退出)
      
# 其他可选参数:
# -policy <policy>:policy的可选值为datanode/blockpool,其中datanode表示在datanode间进行平衡,blockpool表示在
HDFS 中查看文件夹大小是一个常见的运维需求。Hadoop 提供了多种命令来查看 HDFS 目录的磁盘使用情况和文件大小。 --- ## ✅ 方法一:`hdfs dfs -du` — 查看目录中各子目录/文件的大小 ### 命令格式: ```bash hdfs dfs -du <path> ``` ### 示例: ```bash hdfs dfs -du /user/hadoop/data ``` 输出示例: ``` 1048576 /user/hadoop/data/file1.txt 2097152 /user/hadoop/data/file2.txt 3145728 /user/hadoop/data/subdir/file3.parquet ``` - 第一列是字节数(Bytes) - 第二列是完整路径 > 💡 `du` = disk usage,类似于 Linux 的 `du` 命令。 --- ### 显示人类可读格式(推荐):加 `-h` 参数 ```bash hdfs dfs -du -h /user/hadoop/data ``` 输出: ``` 1M /user/hadoop/data/file1.txt 2M /user/hadoop/data/file2.txt 3M /user/hadoop/data/subdir/file3.parquet ``` 更直观地显示 KB、MB、GB 等单位。 --- ### 递归统计所有文件:`-du -h -s` #### 统计整个目录总大小(类似 `du -sh`) ```bash hdfs dfs -du -h -s /user/hadoop/data ``` 输出: ``` 6.0 M /user/hadoop/data ``` - `-s` 表示 summary,只输出总大小。 - 非常适合快速查看某个大目录占了多少空间。 --- ## ✅ 方法二:`hdfs dfs -dus`(已弃用) 旧版本支持 `dus`(即 `du -s` 的简写),但现在已被标记为废弃: ```bash hdfs dfs -dus /user/hadoop/data # 不推荐使用 ``` 建议统一使用 `hdfs dfs -du -s` 或 `hdfs dfs -du -h -s` --- ## ✅ 方法三:通过 Web UI 查看(图形化方式) 访问 HDFS NameNode 的 Web 页面: ``` http://<namenode>:9870 ``` 进入 **"Browse the file system"** → 导航到目标目录 → 每个文件/目录都会显示其大小(以 GB/MB/KB 自动转换)。 优点: - 图形化操作,适合非技术人员 - 可直接下载或查看小文件内容 缺点: - 不适合批量分析多个目录 - 大目录加载可能较慢 --- ## ✅ 方法四:结合 shell 脚本进行自动化统计 如果你想批量检查多个目录的大小,可以写一个简单的 Shell 脚本: ```bash #!/bin/bash for dir in /user/hadoop/input /user/hadoop/output /tmp; do echo "Size of $dir:" hdfs dfs -du -h -s "$dir" done ``` 输出: ``` Size of /user/hadoop/input: 1.2 G /user/hadoop/input Size of /user/hadoop/output: 512 M /user/hadoop/output ... ``` --- ## 🔍 注意事项 | 项目 | 说明 | |------|------| | 单位 | 默认是字节,加上 `-h` 显示为 K/M/G | | 权限 | 需要有读取该 HDFS 路径的权限 | | 副本因素 | `hdfs dfs -du` 显示的是实际存储大小(含副本)。如果想看原始大小,使用 `-du -s -x`(跳过副本)或结合其他工具计算 | | 快照目录 | 如果目录启用了快照,大小统计会包含快照数据 | --- ## 🧩 高级技巧:排除副本影响(逻辑大小 vs 物理大小) HDFS 默认每个文件有 3 个副本(由 `dfs.replication` 控制)。`-du` 显示的是物理占用空间(副本 × 文件大小)。 ### 查看逻辑大小(不考虑副本): ```bash hdfs dfs -du -h -s -x /user/hadoop/data ``` > ⚠️ 注意:`-x` 并不是标准参数,在某些发行版(如 CDH/HDP)中才支持。通用做法是用以下方法估算逻辑大小: ```bash # 先查物理大小,再除以副本数(假设副本数为3) hdfs dfs -du -s /user/hadoop/data | awk '{print $1/3, "bytes"}' ``` 或者从配置获取副本数: ```bash hdfs getconf -confKey dfs.replication ``` --- ## ✅ 总结:常用命令汇总 | 功能 | 命令 | |------|------| | 查看目录下所有文件大小(可读格式) | `hdfs dfs -du -h /path` | | 查看目录总大小 | `hdfs dfs -du -h -s /path` | | 递归列出所有子项大小 | `hdfs dfs -du -h -s /path/*` | | 图形化查看 | 浏览 `http://namenode:9870` | | 脚本化批量统计 | 结合 `for` 循环 + `hdfs dfs -du -h -s` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值