一、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
处理方案:
- 检查HBase/MySQL等外部服务状态
- 调整超时参数:
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%以上。