Hadoop 生产运维实战手册
一、Hadoop 常用运维命令大全
1.1 集群启停脚本(sbin)
说明: 生产环境推荐使用 --daemon 细粒度管理单进程,避免一次性启停全部组件导致故障面扩大。
bash
# 全量启动/停止(开发环境用)
start-dfs.sh
stop-dfs.sh
start-yarn.sh
stop-yarn.sh
# 单进程启停(生产推荐,细粒度可控)
hdfs --daemon start namenode
hdfs --daemon start datanode
hdfs --daemon stop datanode
yarn --daemon start resourcemanager
yarn --daemon start nodemanager
yarn --daemon stop nodemanager
例子图片(plaintext):
plaintext
Hadoop 集群启停架构图
---------------------
主节点
/ | \
NameNode ResourceManager JournalNode(HA)
| |
[start-dfs.sh] [start-yarn.sh]
| |
从节点1 从节点2
DataNode+NM DataNode+NM
start-hdfs → 逐个 DN 上报块信息
start-yarn → 逐个 NM 向 RM 注册
1.2 HDFS 文件系统命令(hdfs dfs)
hadoop fs与hdfs dfs等价,Hadoop3 推荐hdfs dfs。
bash
hdfs dfs -ls / # 查看 HDFS 根目录
hdfs dfs -mkdir -p /data/test # 递归创建目录
hdfs dfs -put local.txt /data/ # 本地文件上传 HDFS
hdfs dfs -get /data/local.txt ./ # HDFS 下载到本地
hdfs dfs -cat /data/local.txt # 查看文件内容
hdfs dfs -tail /data/local.txt # 查看文件尾部
hdfs dfs -rm /data/tmp.txt # 删除文件
hdfs dfs -rm -r /data/dir # 递归删除目录
hdfs dfs -du -h /data # 查看目录占用大小(人类可读)
hdfs dfs -cp /a /b # HDFS 内部拷贝
hdfs dfs -mv /a /b # HDFS 移动/重命名
hdfs dfs -chmod 755 /data # 修改权限
hdfs dfs -chown hdfs:hdfs /data # 修改属主属组
hdfs dfs -count -q /data # 查看目录文件数+配额
hdfs dfs -touchz /data/empty # 创建空文件(占位)
hdfs dfs -setrep 3 /data/file # 设置文件副本数
hdfs dfs -test -e /data/file # 判断文件是否存在
1.3 HDFS 管理员命令(hdfs dfsadmin)
bash
hdfs dfsadmin -report # 集群整体状态、DN磁盘、容量、存活节点
hdfs dfsadmin -safemode get # 查询安全模式状态
hdfs dfsadmin -safemode enter # 手动进入安全模式(只读)
hdfs dfsadmin -safemode leave # 退出安全模式
hdfs dfsadmin -safemode wait # 等待自动退出安全模式
hdfs dfsadmin -refreshNodes # 刷新 exclude/included,触发节点退役/上线
hdfs dfsadmin -metasave meta.info # 保存块、DN信息到本地文件
hdfs dfsadmin -printTopology # 打印机架拓扑
hdfs dfsadmin -allowSnapshot /data # 允许对目录做快照
hdfs dfsadmin -disallowSnapshot /data # 禁止快照
1.4 配额管理
bash
hdfs dfsadmin -setQuota 1000 /data # 文件数配额
hdfs dfsadmin -clrQuota /data # 清除文件数配额
hdfs dfsadmin -setSpaceQuota 10G /data # 空间配额
hdfs dfsadmin -clrSpaceQuota /data # 清除空间配额
1.5 HDFS 检测、均衡、元数据
bash
hdfs fsck / -files -blocks -locations # 全盘检查,坏块/损坏文件定位
hdfs balancer -threshold 10 # 集群数据均衡(threshold=偏差阈值%)
hdfs balancer -Ddfs.balancer.bandwidthPerSec=10485760 # 限速均衡,10MB/s
hdfs getconf -namenodes # 获取 namenode 列表
hdfs getconf -confKey fs.defaultFS # 获取指定配置项
hdfs haadmin -getServiceState nn1 # 查询 HA 主备状态
hdfs haadmin -failover nn1 nn2 # 手动切换主备
hdfs namenode -format # 【仅初始化集群执行!生产严禁】
1.6 YARN 运维命令
bash
yarn node -list # 查看所有 NodeManager
yarn node -status node01:8042 # 查看单个 NM 详情
yarn application -list # 列出运行中任务
yarn application -list -appStates ALL # 列出所有状态任务
yarn application -status app_id # 查看任务详情
yarn application -kill app_id # 终止任务
yarn logs -applicationId app_id # 查看任务日志(聚合开启后)
yarn queue -list # 列出资源队列
yarn queue -status default # 查看队列资源占用
yarn top # 实时查看任务资源 TOP
1.7 其他常用工具
bash
hadoop distcp hdfs://nn1:8020/src hdfs://nn2:8020/dst # 跨集群/跨目录拷贝
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples*.jar pi 2 5
hadoop version
hdfs version
yarn version
二、核心运维场景详解(含排查流程与 plaintext 示例图)
2.1 场景一:HDFS 安全模式(最常见故障)
现象: 无法写入 HDFS,put/mkdir 报错 Name node is in safe mode。
排查步骤:
- 查询安全模式状态
bash
hdfs dfsadmin -safemode get
- 检查坏块与丢失块
bash
hdfs fsck /
重点看输出中
Missing blocks/Corrupt blocks两个字段。
例子图片(plaintext)--- 安全模式故障定位流程:
plaintext
安全模式报错
|
v
[hdfs dfsadmin -safemode get] ──> IN 安全模式
|
+---- 刚重启? ──> 是 ──> 正常自动进入,等待即可
| |
| +----> hdfs dfsadmin -safemode wait
+---- 非正常重启 ──> 运行 hdfs fsck /
|
+-----------------+-----+----------------+
| | |
无坏块 有损坏块 块大规模丢失
| | |
手动退出 评估可重建? 禁止强制退出!
safemode leave | 恢复副本/备份
├─可重建→删除坏文件 否则数据已丢
└─不可重建→从备份恢复
处理方案:
- 场景A:集群刚重启,正常自动进入安全模式 → 等待自动退出,或
hdfs dfsadmin -safemode wait - 场景B:确认无 Missing 块,可临时手动退出:
bash
hdfs dfsadmin -safemode leave
- 场景C:存在损坏块 → 先定位损坏文件,评估数据可否重建,再决定是否删除坏块。
红线: 存在 Missing blocks 时严禁强制退出安全模式,会导致数据永久丢失。
2.2 场景二:DataNode 掉线 / DN 失联
现象: hdfs dfsadmin -report 中节点状态为 Dead,对应 YARN 的 NodeManager 也可能异常。
排查顺序:
bash
hdfs dfsadmin -report # 查看整体存活节点
jps | grep DataNode # 登录问题节点查进程
分层定位:
- 进程不存在:查
hdfs datanode日志,常见根因:磁盘满、数据目录权限、端口冲突、hosts 解析不一致、OOM。 - 进程存在但标记 Dead:网络不通、防火墙、心跳超时(
dfs.heartbeat.interval)。
例子图片(plaintext)--- DN 掉线根因树:
plaintext
DataNode Dead / Lost
|
+----------+-----------+
| |
进程不存在 进程存在但Dead
| |
+---+---+ +---+---+
| | | |
磁盘满 权限错 网络不通 心跳超时
| | | |
数据盘OOM 端口冲突 防火墙 hosts不一致
DN 退役流程(下线旧机器,严禁直接杀进程):
bash
# 1. 在 hdfs.exclude 文件中写入待下线主机名
echo "node06" >> $HADOOP_HOME/etc/hadoop/hdfs.exclude
# 2. 刷新节点列表,触发退役
hdfs dfsadmin -refreshNodes
# 3. 持续观察,直到该节点所有块复制完成
hdfs dfsadmin -report | grep node06
# 4. 块迁移完成后,停止 DN 进程,并从集群移除
hdfs --daemon stop datanode
2.3 场景三:HDFS 坏块 / 损坏块(Corrupt / Missing)
现象: fsck 报损坏块,读取文件报错,任务读取 HDFS 文件失败。
排查命令:
bash
hdfs fsck / -files -blocks -locations
关键字段解读:
Corrupt blocks:块本身损坏,但副本可能仍可用Missing blocks:所有副本全部丢失,存在数据丢失风险
例子图片(plaintext)--- 坏块处理决策:
plaintext
hdfs fsck / 输出 Corrupt/Missing
|
v
定位损坏文件路径
|
+--------+---------+
| |
源数据可重建 源数据不可重建
| |
hdfs dfs -rm 删除 从备份恢复/评估影响
|
或 hdfs fsck / -move 隔离到 /lost+found
处理方案:
bash
# 删除损坏文件(源数据可重建时)
hdfs dfs -rm /data/bad_file
# 或隔离到 lost+found(先保留现场)
hdfs fsck / -move
-delete参数会直接删除带坏块的文件,生产慎用!
2.4 场景四:HDFS 磁盘不均衡
现象: 部分 DN 磁盘使用率 90%+,部分很低,写入倾斜,易触发磁盘满。
排查:
bash
hdfs dfsadmin -report
观察每个 DN 的 DFS Used%,差值超过 10% 即需要均衡。
处理(业务低峰执行,限速避免抢占 IO):
bash
hdfs balancer -threshold 10
# 生产建议限速
hdfs balancer -threshold 10 -Ddfs.balancer.bandwidthPerSec=10485760
例子图片(plaintext)--- 均衡前后:
plaintext
均衡前 均衡后
DN1: 92% ████████████ DN1: 58% ███████
DN2: 88% ███████████ DN2: 55% ██████
DN3: 15% ██ DN3: 57% ███████
DN4: 12% █ DN4: 54% ██████
差 80% → 触发均衡 差 ≤ 10% → 达标
2.5 场景五:YARN NodeManager 掉线
现象: yarn node -list 节点状态 UNHEALTHY / LOST,任务无法调度到该节点。
排查:
bash
yarn node -list
yarn node -status node01:8042
常见根因:
- NM 本地磁盘(
yarn.nodemanager.local-dirs)满,标记不健康 - 磁盘 IO 错误、目录权限不足
- NM 被 OOM kill
- 资源配置(vcore/memory)配置错误
例子图片(plaintext)--- NM 状态转换:
plaintext
NodeManager 状态机
-----------------
NEW ---> RUNNING ---> UNHEALTHY ---> (自动恢复) RUNNING
| |
正常健康 本地磁盘满/IO错误
| |
(正常) 重启NM/清理磁盘
2.6 场景六:YARN 任务异常(卡住、失败、OOM)
现象: MR/Spark/Flink 任务一直 RUNNING 不结束,或 FAILED。
排查步骤:
bash
yarn application -list -appStates ALL # 列出所有任务
yarn application -status app_id # 查看应用状态
yarn logs -applicationId app_id # 查看日志
yarn queue -list # 查看队列资源
例子图片(plaintext)--- 任务故障归因流程:
plaintext
任务卡死/失败
|
v
yarn application -status
|
+----+----+-----+-----+
| | | | |
读HDFS Container 队列资源 NM本地 代码
坏块 OOM 耗尽 磁盘满 异常
| | | |
fsck 调大container 查队列 清理 看logs
检查 内存配置 资源 本地盘 定位
处理:
bash
# 终止异常任务
yarn application -kill app_id
# 调大容器内存示例(Spark)
spark-submit --conf spark.executor.memory=8g ...
2.7 场景七:HDFS 磁盘满
区分两个概念:
- HDFS 存储满 :
hdfs dfsadmin -report中 DFS Used 接近 100% - DN 服务器本地磁盘满(OS盘/数据盘):系统日志、临时文件占满,即使 HDFS 容量有剩余,DN 也会挂掉
处理:
bash
# 检查 HDFS 存储
hdfs dfsadmin -report
hdfs dfs -ls /user/hdfs/.Trash # 清理回收站
# 检查 DN 本地磁盘
df -h
du -sh /var/log/hadoop 2>/dev/null
例子图片(plaintext)--- 磁盘满双层判断:
plaintext
磁盘满
|
+------+-------+
| |
HDFS存储满 DN本地磁盘满
| |
DFS Used 100% df -h 显示100%
| |
清理数据/扩容 清理日志/临时文件
清空回收站 重启DN恢复
2.8 场景八:NN 元数据与 HA 主备切换
注意: 仅限 NN 故障场景,禁止随意操作,HA 集群严禁手动 format。
bash
# 查询 HA 状态
hdfs haadmin -getServiceState nn1
# 查看 NN 元数据目录
hdfs getconf -confKey dfs.namenode.name.dir
# 手动主备切换(故障场景)
hdfs haadmin -failover nn1 nn2
例子图片(plaintext)--- HA 主备切换:
plaintext
Active NN1 Standby NN2
| |
客户端写 实时同步edits
| (JournalNode集群)
[Active失败] |
| v
ZKFC 检测 升级为 Active
|
接管服务
三、自动化运维脚本实现
3.1 HDFS 日常巡检脚本(Shell)
bash
#!/bin/bash
# 文件名: hdfs_check.sh
# 功能: HDFS 核心指标巡检
# 用法: bash hdfs_check.sh
LOGFILE=/var/log/hadoop/hdfs_check.log
ALERT=0
echo "========== HDFS Check $(date '+%Y-%m-%d %H:%M:%S') ==========" >> $LOGFILE
# 1. 安全模式检查
SAFE=$(hdfs dfsadmin -safemode get 2>/dev/null | grep -i "safe mode is ON")
if [ -n "$SAFE" ]; then
echo "[ERROR] HDFS 处于安全模式" >> $LOGFILE
ALERT=1
else
echo "[OK] 安全模式状态正常" >> $LOGFILE
fi
# 2. 坏块检查
hdfs fsck / 2>/dev/null > /tmp/fsck_result.txt
CORRUPT=$(grep -i "corrupt" /tmp/fsck_result.txt | awk '{sum+=$NF} END {print sum+0}')
if [ "$CORRUPT" -gt 0 ]; then
echo "[ERROR] 存在 $CORRUPT 个损坏块" >> $LOGFILE
ALERT=1
else
echo "[OK] 无损坏块" >> $LOGFILE
fi
# 3. 磁盘使用率检查
hdfs dfsadmin -report 2>/dev/null > /tmp/dn_report.txt
MAX_USED=$(grep "DFS Used%" /tmp/dn_report.txt | awk -F'[% ]' '{print $NF}' | sort -rn | head -1)
echo "[INFO] 最大DN磁盘使用率: ${MAX_USED}%" >> $LOGFILE
if [ "$MAX_USED" -gt 85 ]; then
echo "[WARN] 磁盘使用率超过85%" >> $LOGFILE
ALERT=1
fi
# 4. 存活节点数
LIVE=$(grep -c "Live datanodes" /tmp/dn_report.txt)
echo "[INFO] 存活 DataNode 数量: $LIVE" >> $LOGFILE
exit $ALERT
3.2 YARN 日常巡检脚本(Shell)
bash
#!/bin/bash
# 文件名: yarn_check.sh
# 功能: YARN 集群巡检(NM健康、队列资源)
# 用法: bash yarn_check.sh
LOGFILE=/var/log/hadoop/yarn_check.log
echo "========== YARN Check $(date '+%Y-%m-%d %H:%M:%S') ==========" >> $LOGFILE
# 1. 节点状态汇总
yarn node -list 2>/dev/null > /tmp/yarn_node.txt
UNHEALTHY=$(grep -c "UNHEALTHY" /tmp/yarn_node.txt)
LOST=$(grep -c "LOST" /tmp/yarn_node.txt)
echo "[INFO] 不健康NM: $UNHEALTHY, 丢失NM: $LOST" >> $LOGFILE
if [ "$UNHEALTHY" -gt 0 ] || [ "$LOST" -gt 0 ]; then
echo "[WARN] 存在异常NM,请检查NM本地磁盘和进程" >> $LOGFILE
fi
# 2. 运行中任务数
yarn application -list 2>/dev/null | grep -c "RUNNING" | awk '{print "[INFO] 运行中任务数: "$1}' >> $LOGFILE
# 3. 队列资源检查
yarn queue -status default 2>/dev/null | grep -E "Used|Max" | head -5 >> $LOGFILE
3.3 一键巡检汇总 + 邮件告警(Shell + mailx)
bash
#!/bin/bash
# 文件名: hdfs_monitor.sh
# 功能: 一键巡检,异常时发送邮件告警
# 依赖: mailx(yum install mailx)
# 邮件收件人
MAIL_TO="ops@example.com"
ALERT_LEVEL=0
# 1. 执行 HDFS 巡检
bash /opt/scripts/hdfs_check.sh
HDFS_ALERT=$?
# 2. 执行 YARN 巡检
bash /opt/scripts/yarn_check.sh
# 3. 汇总判断并告警
if [ "$HDFS_ALERT" -eq 1 ]; then
echo "HDFS 巡检异常,请及时处理!详情见日志 /var/log/hadoop/hdfs_check.log" \
| mailx -s "[ALERT] HDFS异常 $(date '+%F %T')" "$MAIL_TO"
ALERT_LEVEL=1
fi
exit $ALERT_LEVEL
3.4 钉钉机器人告警脚本(Shell + curl)
bash
#!/bin/bash
# 文件名: ding_alert.sh
# 功能: 推送告警到钉钉群机器人
# 前置: 在钉钉群添加自定义机器人,获取 webhook
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
send_alert() {
local content="$1"
curl -s -H "Content-Type: application/json" -X POST "$WEBHOOK_URL" -d "{
\"msgtype\": \"text\",
\"text\": { \"content\": \"[Hadoop告警] $content\" }
}"
}
# 调用示例
send_alert "HDFS 进入安全模式,请立即排查"
3.5 Python 巡检脚本(采集 + 结构化输出)
python
#!/usr/bin/env python3
# 文件名: hadoop_check.py
# 功能: 调用 hadoop 命令采集指标,输出 JSON 便于对接监控平台
import subprocess
import json
import re
def run_cmd(cmd):
"""执行命令并返回 stdout"""
try:
result = subprocess.run(
cmd, shell=True, capture_output=True, text=True, timeout=60
)
return result.stdout
except Exception as e:
return f"ERROR: {e}"
def get_safemode():
out = run_cmd("hdfs dfsadmin -safemode get")
return "ON" if "safe mode is ON" in out else "OFF"
def get_bad_blocks():
out = run_cmd("hdfs fsck /")
m = re.search(r"Corrupt blocks:\s*(\d+)", out)
return int(m.group(1)) if m else 0
def get_dn_usage():
out = run_cmd("hdfs dfsadmin -report")
percents = re.findall(r"DFS Used%:\s*([\d.]+)%", out)
if not percents:
return []
return [float(p) for p in percents]
def main():
report = {
"safemode": get_safemode(),
"corrupt_blocks": get_bad_blocks(),
"max_dn_usage": max(get_dn_usage()) if get_dn_usage() else 0,
"check_time": run_cmd("date '+%Y-%m-%d %H:%M:%S'").strip(),
}
print(json.dumps(report, ensure_ascii=False, indent=2))
if __name__ == "__main__":
main()
四、定时巡检(crontab 配置)
bash
# 每天 02:30 执行 HDFS 巡检
30 2 * * * bash /opt/scripts/hdfs_check.sh >> /var/log/hadoop/cron.log 2>&1
# 每天 02:35 执行 YARN 巡检
35 2 * * * bash /opt/scripts/yarn_check.sh >> /var/log/hadoop/cron.log 2>&1
# 每天 03:00 执行一键巡检并告警
0 3 * * * bash /opt/scripts/hdfs_monitor.sh
五、运维红线(生产严禁操作)
- 集群运行中执行
hdfs namenode -format,元数据直接丢失。 - 存在
Missing blocks时强制退出安全模式。 - DN 退役不执行 exclude + refreshNodes,直接杀进程,引发大量块丢失。
- 业务高峰跑 balancer,抢占 IO 导致业务超时。
- 随意删除
/lost+found、fsimage、edits 文件。 - HA 集群上随意 format 或误操作 JournalNode。
六、运维最佳实践总结
- 操作前先记录时间、应用ID、节点信息;重大操作前先备份元数据,业务低峰期执行。
- 巡检建议纳入监控平台(Prometheus + Grafana),对接钉钉/企业微信告警。
- 日常巡检项固化:安全模式状态、DN存活数、Missing/Corrupt块数、磁盘使用率、NM健康、队列资源、节点服务器磁盘/内存/进程。
- 均衡、退役、扩容等批量动作统一走变更流程,保留操作日志,方便回溯。
- 针对 HDFS 数据倾斜、YARN 队列配额、磁盘容量做周期性容量规划。