本文详细介绍Hadoop故障排查与性能调优实战,包括HDFS、YARN、Hive等组件的常见问题排查和性能优化,参考Hadoop官方运维文档,适合大数据运维工程师使用。学习交流加群风哥微信: itpux-com
Part01-基础概念与理论知识
1.1 故障排查概述
故障排查是指在系统出现问题时,通过收集信息、分析问题、定位原因、解决问题的过程。更多视频教程www.fgedu.net.cn
- 快速定位问题原因
- 及时恢复服务
- 避免问题复发
- 持续优化系统
1.2 故障排查方法论
故障排查方法论:
1. 问题确认
– 确认问题现象
– 确认影响范围
– 确认问题时间
2. 信息收集
– 查看监控指标
– 查看系统日志
– 查看应用日志
– 查看配置信息
3. 问题分析
– 分析异常指标
– 分析错误日志
– 分析调用链
– 分析资源使用
4. 原因定位
– 假设原因
– 验证假设
– 确定根因
5. 问题解决
– 制定解决方案
– 执行解决方案
– 验证问题解决
6. 总结复盘
– 记录问题
– 分析根因
– 制定预防措施
– 文档更新
# 排查思路
从外到内:
– 用户端 -> 网络 -> 服务端 -> 应用 -> 系统
从上到下:
– 应用层 -> 服务层 -> 系统层 -> 硬件层
从易到难:
– 先检查简单问题
– 再检查复杂问题
– 最后检查深层问题
1.3 常用工具介绍
常用排查工具:
Part02-生产环境规划与建议
2.1 监控体系规划
监控体系规划要点:
基础监控:
– CPU使用率
– 内存使用率
– 磁盘使用率
– 磁盘IO
– 网络IO
– 系统负载
JVM监控:
– Heap内存
– GC次数
– GC时间
– 线程数
– 类加载
HDFS监控:
– NameNode状态
– DataNode状态
– 存储空间
– RPC队列
– 读写延迟
YARN监控:
– ResourceManager状态
– NodeManager状态
– 集群资源
– 队列资源
– 应用状态
# 监控工具
指标采集:
– Prometheus
– Zabbix
– Nagios
可视化:
– Grafana
– Hadoop Web UI
告警:
– Alertmanager
– 邮件
– 短信
– 企业微信/钉钉
2.2 日志管理
日志管理:
- 系统日志:/var/log/messages、/var/log/secure
- Hadoop日志:/bigdata/app/hadoop/logs
- Hive日志:/bigdata/app/hive/logs
- 应用日志:自定义路径
from bigdata视频:www.itpux.com
2.3 故障处理规范
故障处理规范:
P0(紧急):
– 整个集群不可用
– 核心业务中断
– 响应时间:立即
– 处理时间:30分钟内
P1(高):
– 单个服务不可用
– 部分业务受影响
– 响应时间:30分钟内
– 处理时间:4小时内
P2(中):
– 功能异常
– 性能下降
– 响应时间:2小时内
– 处理时间:24小时内
P3(低):
– 轻微问题
– 不影响业务
– 响应时间:24小时内
– 处理时间:72小时内
# 故障记录
记录内容:
– 故障时间
– 故障现象
– 影响范围
– 处理过程
– 根因分析
– 解决方案
– 预防措施
– 处理人
Part03-生产环境项目实施方案
3.1 HDFS故障排查实战
3.1.1 HDFS常见问题
# 排查步骤:
1. 查看NameNode日志
tail -100f /bigdata/app/hadoop/logs/hadoop-hdfs-namenode-*.log
2. 检查磁盘空间
df -h
3. 检查端口占用
netstat -tulnp | grep 9870
4. 检查元数据
ls -lh /bigdata/fgdata/hdfs/name/current/
5. 常见原因:
– 磁盘满
– 元数据损坏
– 端口被占用
– 权限问题
# 问题2:DataNode无法启动
# 排查步骤:
1. 查看DataNode日志
tail -100f /bigdata/app/hadoop/logs/hadoop-hdfs-datanode-*.log
2. 检查与NameNode通信
telnet fgedu-nn 9870
3. 检查数据目录权限
ls -ld /bigdata/fgdata/hdfs/data
4. 检查磁盘
df -h
iostat -x 1
5. 常见原因:
– 无法连接NameNode
– 数据目录权限问题
– 磁盘满
– 磁盘损坏
# 问题3:HDFS读写出错
# 排查步骤:
1. 查看客户端日志
2. 查看DataNode日志
3. 检查网络
ping fgedu-dn01
traceroute fgedu-dn01
4. 检查磁盘
iostat -x 1
dmesg | grep error
5. 检查坏块
hdfs fsck / -list-corruptfileblocks
6. 常见原因:
– 网络问题
– 磁盘问题
– DataNode异常
– 副本不足
# 问题4:HDFS空间不足
# 排查步骤:
1. 查看空间使用
hdfs dfs -df -h
2. 查看大文件
hdfs dfs -du -h / | sort -hr | head -20
3. 检查回收站
hdfs dfs -du -h /user/*/.Trash
4. 检查临时文件
hdfs dfs -du -h /tmp
5. 解决方案:
– 清理过期数据
– 清空回收站
– 清理临时文件
– 增加DataNode
– 扩容
# 问题5:HDFS坏块
# 排查步骤:
1. 检查坏块
hdfs fsck / -list-corruptfileblocks
2. 查看坏块位置
hdfs fsck /path/to/file -files -blocks -locations
3. 自动修复
hdfs fsck / -delete
4. 手动恢复
# 从备份恢复
# 重新生成数据
5. 预防措施:
– 监控坏块
– 定期巡检
– 及时更换坏盘
3.2 YARN故障排查实战
3.2.1 YARN常见问题
# 排查步骤:
1. 查看RM日志
tail -100f /bigdata/app/hadoop/logs/hadoop-yarn-resourcemanager-*.log
2. 检查ZooKeeper
echo stat | nc fgedu-zk01 2181
3. 检查端口
netstat -tulnp | grep 8088
4. 常见原因:
– ZooKeeper连接失败
– 端口被占用
– 磁盘满
– 权限问题
# 问题2:NodeManager无法启动
# 排查步骤:
1. 查看NM日志
tail -100f /bigdata/app/hadoop/logs/hadoop-yarn-nodemanager-*.log
2. 检查与RM通信
telnet fgedu-rm 8032
3. 检查本地目录
ls -ld /bigdata/fgdata/yarn/local
4. 常见原因:
– 无法连接RM
– 本地目录权限问题
– 磁盘满
– 资源不足
# 问题3:应用提交失败
# 排查步骤:
1. 查看客户端日志
2. 查看RM日志
3. 检查队列资源
yarn queue -status root.production
4. 检查用户权限
5. 常见原因:
– 队列资源不足
– 权限不足
– 配置错误
– 依赖缺失
# 问题4:应用运行缓慢
# 排查步骤:
1. 查看Application UI
# http://fgedu-rm:8088
2. 查看Container日志
yarn logs -applicationId <app_id>
3. 检查资源使用
4. 检查数据倾斜
5. 常见原因:
– 数据倾斜
– 资源不足
– GC频繁
– 网络问题
– 磁盘IO慢
# 问题5:Container频繁被Kill
# 排查步骤:
1. 查看Container日志
2. 检查内存使用
3. 检查OOM
dmesg | grep -i oom
4. 常见原因:
– 内存溢出
– 内存配置不足
– 资源超限
3.3 Hive故障排查实战
3.3.1 Hive常见问题
# 排查步骤:
1. 查看HiveServer2日志
tail -100f /bigdata/app/hive/logs/hive.log
2. 检查Metastore
telnet fgedu-hms 9083
3. 检查端口
netstat -tulnp | grep 10000
4. 检查MySQL
mysql -h fgedu-mysql -u hive -p
5. 常见原因:
– Metastore连接失败
– MySQL连接失败
– 端口被占用
– 内存不足
# 问题2:Hive查询慢
# 排查步骤:
1. 查看执行计划
EXPLAIN SELECT * FROM fgedu_db.fgedu_user;
2. 检查数据量
SELECT COUNT(*) FROM fgedu_db.fgedu_user;
3. 检查分区
SHOW PARTITIONS fgedu_db.fgedu_user_log;
4. 检查小文件
hdfs dfs -du -h /bigdata/fgdata/hive/warehouse/fgedu_db.db/fgedu_user_log/
5. 常见原因:
– 没有走分区
– 小文件过多
– 数据倾斜
– 统计信息缺失
– 资源不足
# 问题3:Hive权限问题
# 排查步骤:
1. 检查当前用户
whoami
2. 检查HDFS权限
hdfs dfs -ls /bigdata/fgdata/hive/warehouse/fgedu_db.db/
3. 检查Ranger/Sentry策略
# Ranger Web UI
4. 常见原因:
– HDFS权限不足
– Ranger策略未配置
– 用户组不对
# 问题4:Metastore异常
# 排查步骤:
1. 查看Metastore日志
tail -100f /bigdata/app/hive/logs/metastore.log
2. 检查MySQL连接
mysql -h fgedu-mysql -u hive -p -e “SHOW TABLES;”
3. 检查MySQL慢查询
4. 常见原因:
– MySQL连接失败
– MySQL慢查询
– 元数据损坏
– 锁等待
Part04-生产案例与实战讲解
4.1 慢查询优化实战
4.1.1 Hive慢查询优化
EXPLAIN SELECT * FROM fgedu_db.fgedu_user_log WHERE dt = ‘2024-04-08′;
— 2. 开启分区裁剪
SET hive.optimize.pruner=true;
— 3. 开启CBO
SET hive.cbo.enable=true;
SET hive.compute.query.using.stats=true;
SET hive.stats.fetch.column.stats=true;
— 4. 使用Tez引擎
SET hive.execution.engine=tez;
— 5. 优化JOIN
— 小表放左边
SET hive.auto.convert.join=true;
SET hive.mapjoin.smalltable.filesize=25000000;
— 6. 并行执行
SET hive.exec.parallel=true;
SET hive.exec.parallel.thread.number=8;
— 7. 矢量化执行
SET hive.vectorized.execution.enabled=true;
SET hive.vectorized.execution.reduce.enabled=true;
— 8. 收集统计信息
ANALYZE TABLE fgedu_db.fgedu_user COMPUTE STATISTICS;
ANALYZE TABLE fgedu_db.fgedu_user PARTITION (dt=’2024-04-08’) COMPUTE STATISTICS;
— 9. 合并小文件
SET hive.merge.mapfiles=true;
SET hive.merge.mapredfiles=true;
SET hive.merge.size.per.task=256000000;
— 10. 优化SQL示例
— 优化前:
SELECT * FROM fgedu_db.fgedu_user_log;
— 优化后:
SELECT * FROM fgedu_db.fgedu_user_log WHERE dt = ‘2024-04-08’;
4.2 数据倾斜处理实战
4.2.1 数据倾斜处理
— 查看Key分布
SELECT user_id, COUNT(*)
FROM fgedu_db.fgedu_user_log
WHERE dt = ‘2024-04-08’
GROUP BY user_id
ORDER BY COUNT(*) DESC
LIMIT 10;
— 2. 开启数据倾斜优化
SET hive.optimize.skewjoin=true;
SET hive.skewjoin.key=100000;
SET hive.groupby.skewindata=true;
— 3. 过滤异常数据
SELECT * FROM fgedu_db.fgedu_user_log
WHERE dt = ‘2024-04-08’
AND user_id IS NOT NULL
AND user_id != 0;
— 4. 两阶段聚合
— 第一阶段:加盐
SELECT
user_id,
CONCAT(user_id, ‘_’, FLOOR(RAND() * 100)) AS user_id_skew,
COUNT(*) AS cnt
FROM fgedu_db.fgedu_user_log
WHERE dt = ‘2024-04-08’
GROUP BY user_id, CONCAT(user_id, ‘_’, FLOOR(RAND() * 100));
— 第二阶段:去盐聚合
SELECT
user_id,
SUM(cnt) AS total_cnt
FROM (
SELECT
SPLIT(user_id_skew, ‘_’)[0] AS user_id,
cnt
FROM temp_skew_table
) t
GROUP BY user_id;
— 5. 调整并行度
SET mapreduce.job.reduces=100;
— 6. 数据本地化
SET hive.optimize.index.filter=true;
SET hive.optimize.ppd=true;
4.3 服务中断处理实战
4.3.1 NameNode故障处理
# 场景:NameNode主节点宕机
# 1. 确认故障
# 查看监控告警
# 尝试访问Web UI
# 检查NameNode进程
jps | grep NameNode
# 2. 查看日志
tail -200f /bigdata/app/hadoop/logs/hadoop-hdfs-namenode-*.log
# 3. 尝试手动启动
su – hdfs
hdfs –daemon start namenode
# 4. 如果启动失败,切换到Standby
# 确认Standby节点状态
hdfs haadmin -getServiceState nn2
# 5. 故障转移
hdfs haadmin -failover nn1 nn2
# 6. 验证服务
hdfs dfsadmin -report
hdfs dfs -ls /
# 7. 恢复主节点
# 修复主节点问题
# 重启主节点
# 确认主节点同步
hdfs haadmin -getServiceState nn1
# 8. 切换回主节点(可选)
hdfs haadmin -failover nn2 nn1
# 9. 事后复盘
# 记录故障过程
# 分析根因
# 制定预防措施
# 更新文档
# 预防措施:
– 配置HA
– 监控NameNode状态
– 定期检查磁盘
– 定期备份元数据
– 定期演练切换
Part05-风哥经验总结与分享
5.1 故障排查最佳实践
故障排查最佳实践:
- 建立知识库:记录常见问题和解决方案
- 完善监控:全方位监控,及时发现问题
- 定期演练:定期故障演练,提升处理能力
- 文档记录:记录处理过程,便于复盘
- 根因分析:深入分析,避免重复问题
5.2 常见问题汇总
1. NameNode启动失败
– 检查磁盘空间
– 检查元数据
– 检查日志
2. DataNode掉线
– 检查网络
– 检查磁盘
– 检查日志
3. 读写出错
– 检查网络
– 检查磁盘
– 检查副本
4. 空间不足
– 清理过期数据
– 清理回收站
– 扩容
# YARN常见问题
1. 应用提交失败
– 检查权限
– 检查队列
– 检查资源
2. 应用运行慢
– 检查数据倾斜
– 检查资源
– 检查日志
3. Container被Kill
– 检查内存
– 检查OOM
– 调整配置
# Hive常见问题
1. 查询慢
– 检查分区
– 检查小文件
– 优化SQL
2. 权限问题
– 检查HDFS权限
– 检查Ranger策略
– 检查用户组
3. Metastore异常
– 检查MySQL
– 检查日志
– 检查锁
5.3 故障处理检查清单
– [ ] 确认故障现象
– [ ] 确认影响范围
– [ ] 查看监控指标
– [ ] 查看系统日志
– [ ] 查看应用日志
– [ ] 分析问题原因
– [ ] 制定解决方案
– [ ] 执行解决方案
– [ ] 验证问题解决
– [ ] 记录处理过程
– [ ] 根因分析
– [ ] 制定预防措施
– [ ] 更新文档
– [ ] 复盘总结
# 故障预防检查清单
– [ ] 监控完善
– [ ] 告警配置
– [ ] 日志收集
– [ ] 定期备份
– [ ] 定期巡检
– [ ] 定期演练
– [ ] 知识库完善
– [ ] 文档齐全
– [ ] 权限控制
– [ ] 容量规划
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
