常见故障场景与解决

136 阅读3分钟

一、DataNode磁盘写满处理指南


1. 故障现象识别

  • HDFS写入操作失败(No space left on device错误)
  • DataNode进程异常退出或日志报磁盘空间不足
  • Web UI显示DataNode存储使用率超过95%

2. 应急处理步骤

2.1 临时空间清理

# 查找大文件(按大小排序)
hdfs dfs -du -h / | sort -hr | head -n 20

# 清理过期数据(保留最近7天)
hdfs dfs -rm -r /tmp/*$(date -d "7 days ago" +%Y%m%d)*

# 清空回收站(谨慎操作)
hdfs dfs -expunge

2.2 紧急扩容(云环境)

# AWS EBS扩容示例(需提前配置LVM)
aws ec2 modify-volume --volume-id vol-12345 --size 1000
sudo pvresize /dev/xvdf
sudo lvextend -l +100%FREE /dev/mapper/vg_data-lv_hdfs
sudo xfs_growfs /hdfs_data

3. 根因分析与根治方案

3.1 常见原因矩阵

原因类型特征表现解决方案
小文件堆积大量<128MB文件合并小文件,设置合并策略
日志文件膨胀/var/log占用率高配置日志轮转策略
HDFS副本过多实际数据量*副本数超容量调整dfs.replication参数
存储计算未分离DataNode与计算任务混部迁移计算任务到独立节点

3.2 存储容量规划公式

最小磁盘空间 = \frac{原始数据量 \times 副本数 \times 1.2}{节点数} \times 未来6个月增长率

4. 预防性配置

4.1 HDFS配额管理

# 设置目录配额(限制100GB)
hdfs dfsadmin -setSpaceQuota 100G /user/team_a

# 查看配额使用
hdfs dfs -count -q -h /user/team_a

4.2 自动化清理策略

<!-- hdfs-site.xml -->
<property>
  <name>fs.trash.interval</name>
  <value>1440</value> <!-- 保留24小时 -->
</property>
<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value> <!-- 控制editlog增长 -->
</property>

二、YARN任务卡死分析手册


1. 故障现象识别

  • 任务长时间处于RUNNING状态但无进展
  • 资源管理器UI显示任务占用资源但无更新
  • NodeManager日志出现Container killed警告

2. 快速诊断步骤

2.1 资源检查

# 查看集群资源概况
yarn node -list -showDetails

# 检查任务资源请求
yarn application -status <ApplicationID> | grep -A 5 "Resource"

2.2 线程分析

# 获取问题容器ID
yarn logs -applicationId <AppID> | grep "Container ID"

# 进入对应NodeManager节点
jstack <Container_PID> | grep -A 20 "BLOCKED"

3. 典型场景处理

3.1 资源死锁

// 典型死锁代码特征
synchronized(objA) {
    synchronized(objB) { // 可能发生交叉锁
        // 业务逻辑
    }
}

处理方案:使用jstack定位死锁线程,重启AM并优化锁机制

3.2 数据倾斜

-- 发生数据倾斜的HiveQL特征
SELECT user_id, COUNT(*) 
FROM logs 
GROUP BY user_id; -- 某几个user_id记录量极大

处理方案:添加随机前缀进行两阶段聚合

3.3 外部依赖阻塞

# 典型日志表现
java.net.SocketTimeoutException: Read timed out

处理方案

  1. 检查HBase/MySQL等外部服务状态
  2. 调整超时参数:mapreduce.task.timeout=600000

4. 高级调试工具

4.1 堆内存分析

# 生成堆转储文件
jmap -dump:live,format=b,file=heapdump.hprof <PID>

# 使用MAT分析内存泄漏

4.2 网络诊断

# 跟踪容器网络连接
nsenter -t <PID> -n netstat -tnp

# 模拟任务网络环境
yarn node -list | grep <NodeIP>
ssh <NodeIP> "iptables -A INPUT -p tcp --dport 8042 -j DROP" # 模拟网络分区

5. 预防性配置优化

5.1 YARN参数调优

<!-- yarn-site.xml -->
<property>
  <name>yarn.nodemanager.resource.memory-mb</name>
  <value>总内存 * 0.8</value>
</property>
<property>
  <name>yarn.scheduler.maximum-allocation-mb</name>
  <value>16384</value> <!-- 与NM配置匹配 -->
</property>

5.2 任务健康监测

# 启用Spark心跳检测
spark-submit --conf spark.executor.heartbeatInterval=60s

三、联动故障处理流程

graph TD
    A[故障报警] --> B{磁盘空间?}
    B -->|是| C[DataNode清理流程]
    B -->|否| D[检查YARN队列]
    D --> E{资源不足?}
    E -->|是| F[扩容或优化任务]
    E -->|否| G[线程分析]
    G --> H[生成诊断报告]

操作注意:生产环境操作前务必在测试集群验证,关键删除操作需审批留痕。定期进行故障演练可降低真实故障处理时间30%以上。