Hadoop 生产运维实战手册

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。

排查步骤:

  1. 查询安全模式状态
bash 复制代码
hdfs dfsadmin -safemode get
  1. 检查坏块与丢失块
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 磁盘满

区分两个概念:

  1. HDFS 存储满 :hdfs dfsadmin -report 中 DFS Used 接近 100%
  2. 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

五、运维红线(生产严禁操作)

  1. 集群运行中执行 hdfs namenode -format,元数据直接丢失。
  2. 存在 Missing blocks 时强制退出安全模式。
  3. DN 退役不执行 exclude + refreshNodes,直接杀进程,引发大量块丢失。
  4. 业务高峰跑 balancer,抢占 IO 导致业务超时。
  5. 随意删除 /lost+found、fsimage、edits 文件。
  6. HA 集群上随意 format 或误操作 JournalNode。

六、运维最佳实践总结

  • 操作前先记录时间、应用ID、节点信息;重大操作前先备份元数据,业务低峰期执行。
  • 巡检建议纳入监控平台(Prometheus + Grafana),对接钉钉/企业微信告警。
  • 日常巡检项固化:安全模式状态、DN存活数、Missing/Corrupt块数、磁盘使用率、NM健康、队列资源、节点服务器磁盘/内存/进程。
  • 均衡、退役、扩容等批量动作统一走变更流程,保留操作日志,方便回溯。
  • 针对 HDFS 数据倾斜、YARN 队列配额、磁盘容量做周期性容量规划。
相关推荐
QYR-分析1 小时前
汽车可开启全景天窗:座舱舒适核心配置,智能化升级打开产品溢价空间
大数据·人工智能·汽车
Raas1002 小时前
2026年AI网关推荐?MAI Gateway(魔芋企业级AI网关)等主流方案横评
大数据·人工智能·ai·gateway·ai网关·mai gateway
张文君2 小时前
Ubuntu iSCSI CHAP认证与Win11挂载
linux·运维·ubuntu
泡干脆面就番茄2 小时前
Hive窗口函数:从原理到三大面试题
大数据·数据仓库·hive·hadoop
一个热爱拳击的玩家2 小时前
本地实体如何构建面向 AI 检索的信任链?以杭州拳击行业案例分析
大数据·人工智能·信任链
程序员-Benothing2 小时前
Linux防火墙配置教程:iptables、firewalld、nftables、ufw
linux·运维·服务器
byte轻骑兵2 小时前
时序数据库选型指南:面向工业物联网大数据场景,Apache IoTDB落地实践
大数据·人工智能·物联网·时序数据库·人大金仓
墨神谕2 小时前
Elasticsearch 倒排索引底层原理详解:从 Term Dictionary、FST 到海量数据性能优化
大数据·elasticsearch·搜索引擎
程序员梅雨2 小时前
Hive面试总结
hive·hadoop·面试