内容简介:本篇文章系统讲解Hadoop集群问题定位的方法论和实践技巧。涵盖问题分类、定位思路、排查工具、分析方法、解决策略等关键内容,提供完整的问题定位解决方案,帮助运维人员建立系统化的问题定位能力,快速准确地定位和解决Hadoop集群问题。参考系统调试方法论、性能分析最佳实践、Apache Hadoop官方故障排查文档。
目录大纲
- Part01-基础概念与理论知识
- 1.1 问题分类与特征
- 1.2 问题定位方法论
- 1.3 问题定位思路
- Part02-生产环境规划与建议
- 2.1 问题排查工具
- 2.2 问题分析方法
- 2.3 问题解决策略
- Part03-生产环境项目实施方案
- 3.1 HDFS问题定位实战
- 3.2 YARN问题定位实战
- 3.3 Hive问题定位实战
- Part04-生产案例与实战讲解
- 4.1 性能问题定位案例
- 4.2 稳定性问题定位案例
- 4.3 数据一致性问题定位案例
- Part05-风哥经验总结与分享
- 5.1 问题定位常见误区
- 5.2 问题定位最佳实践
- 5.3 问题定位能力提升
Part01-基础概念与理论知识
1.1 问题分类与特征
Hadoop集群问题分类:
| 问题类型 | 特征 | 影响范围 | 定位难度 |
|---|---|---|---|
| 性能问题 | 响应慢、吞吐低 | 部分或全部业务 | 中等 |
| 稳定性问题 | 服务中断、进程崩溃 | 部分或全部业务 | 高 |
| 数据一致性问题 | 数据丢失、数据不一致 | 数据层面 | 高 |
| 资源问题 | 资源不足、资源泄漏 | 系统层面 | 中等 |
| 网络问题 | 网络延迟、网络中断 | 网络层面 | 中等 |
更多视频教程www.fgedu.net.cn
1.2 问题定位方法论
问题定位方法论:
- 结构化方法:按照固定流程进行问题定位
- 假设驱动方法:提出假设,验证假设
- 数据驱动方法:基于数据分析问题
- 经验驱动方法:基于经验判断问题
结构化问题定位流程:
- 问题定义:明确问题现象和影响范围
- 信息收集:收集相关信息和日志
- 问题分析:分析问题,找出可能原因
- 假设验证:提出假设,验证假设
- 问题解决:解决问题,验证效果
- 经验总结:总结经验,避免重复
1.3 问题定位思路
问题定位思路:
- 从外到内:从外部现象到内部原因
- 从简到繁:从简单问题到复杂问题
- 从点到面:从单个问题到整体问题
- 从现象到本质:从表面现象到根本原因
问题定位原则:
- 先易后难:先解决简单问题,再解决复杂问题
- 先外后内:先检查外部因素,再检查内部因素
- 先软后硬:先检查软件问题,再检查硬件问题
- 先近后远:先检查近端问题,再检查远端问题
风哥提示:问题定位需要系统化的方法论,按照固定流程进行,避免遗漏关键信息。
Part02-生产环境规划与建议
2.1 问题排查工具
常用问题排查工具:
- 监控工具:Prometheus、Grafana、Zabbix等
- 日志工具:ELK Stack、Splunk、Flume等
- 诊断工具:jstack、jmap、jstat、jinfo等
- 网络工具:ping、telnet、netstat、tcpdump等
- 系统工具:top、vmstat、iostat、sar等
工具选择建议:
- 根据问题类型选择合适的工具
- 优先使用自动化工具,提高效率
- 组合使用多种工具,全面分析问题
- 熟悉工具使用,提高问题定位效率
更多视频教程www.fgedu.net.cn
2.2 问题分析方法
常用问题分析方法:
- 对比分析:对比正常和异常状态,找出差异
- 趋势分析:分析指标趋势,找出变化规律
- 关联分析:分析指标关联性,找出因果关系
- 根因分析:深入分析根本原因,避免表面现象
分析技巧:
- 多维度分析:从多个维度分析问题
- 时间序列分析:分析时间序列数据
- 关联分析:分析指标之间的关联性
- 根因分析:深入分析根本原因
2.3 问题解决策略
问题解决策略:
- 快速恢复:优先恢复服务,再分析原因
- 临时方案:采用临时方案,快速恢复
- 根本解决:找出根本原因,彻底解决
- 预防措施:制定预防措施,避免重复
解决原则:
- 优先恢复服务:先恢复服务,再分析原因
- 采用临时方案:快速恢复,再彻底解决
- 找出根本原因:深入分析,彻底解决
- 制定预防措施:避免问题重复
更多视频教程www.fgedu.net.cn
Part03-生产环境项目实施方案
3.1 HDFS问题定位实战
HDFS问题定位脚本示例:
#!/bin/bash
# HDFS问题定位脚本
# 整理发布:风哥
# 日期:2024-01-15
# 配置参数
HADOOP_HOME=/opt/hadoop
LOG_DIR=/data/troubleshoot/logs
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=$LOG_DIR/hdfs_troubleshoot_$DATE.log
# 创建日志目录
mkdir -p $LOG_DIR
# 开始问题定位
echo "========================================" >> $LOG_FILE
echo "HDFS问题定位开始" >> $LOG_FILE
echo "时间:$(date)" >> $LOG_FILE
echo "========================================" >> $LOG_FILE
# 1. 问题定义
echo "1. 问题定义" >> $LOG_FILE
echo "问题描述:HDFS读写性能下降" >> $LOG_FILE
echo "影响范围:所有HDFS读写操作" >> $LOG_FILE
# 2. 信息收集
echo "2. 信息收集" >> $LOG_FILE
# 2.1 HDFS集群状态
echo "2.1 HDFS集群状态" >> $LOG_FILE
$HADOOP_HOME/bin/hdfs dfsadmin -report >> $LOG_FILE 2>&1
# 2.2 NameNode状态
echo "2.2 NameNode状态" >> $LOG_FILE
NAMENODE_PID=$(jps | grep NameNode | awk '{print $1}')
echo "NameNode PID: $NAMENODE_PID" >> $LOG_FILE
if [ -n "$NAMENODE_PID" ]; then
echo "NameNode CPU使用率:" >> $LOG_FILE
ps -p $NAMENODE_PID -o %cpu >> $LOG_FILE
echo "NameNode内存使用:" >> $LOG_FILE
ps -p $NAMENODE_PID -o rss >> $LOG_FILE
echo "NameNode线程数:" >> $LOG_FILE
ps -p $NAMENODE_PID -o thcount >> $LOG_FILE
fi
# 2.3 DataNode状态
echo "2.3 DataNode状态" >> $LOG_FILE
$HADOOP_HOME/bin/hdfs dfsadmin -report -live >> $LOG_FILE 2>&1
# 2.4 HDFS日志
echo "2.4 HDFS日志" >> $LOG_FILE
echo "NameNode日志(最近100行):" >> $LOG_FILE
tail -100 $HADOOP_HOME/logs/hadoop-*-namenode-*.log | grep -i error >> $LOG_FILE
echo "DataNode日志(最近100行):" >> $LOG_FILE
tail -100 $HADOOP_HOME/logs/hadoop-*-datanode-*.log | grep -i error >> $LOG_FILE
# 2.5 系统资源
echo "2.5 系统资源" >> $LOG_FILE
echo "CPU使用率:" >> $LOG_FILE
top -b -n 1 | head -20 >> $LOG_FILE
echo "内存使用:" >> $LOG_FILE
free -h >> $LOG_FILE
echo "磁盘使用:" >> $LOG_FILE
df -h >> $LOG_FILE
echo "网络状态:" >> $LOG_FILE
netstat -an | grep 9000 >> $LOG_FILE
# 3. 问题分析
echo "3. 问题分析" >> $LOG_FILE
# 3.1 性能分析
echo "3.1 性能分析" >> $LOG_FILE
echo "HDFS读延迟测试:" >> $LOG_FILE
time $HADOOP_HOME/bin/hdfs dfs -cat /test/file > /dev/null 2>&1
echo "HDFS写延迟测试:" >> $LOG_FILE
time $HADOOP_HOME/bin/hdfs dfs -put /etc/hosts /test/test_file >> $LOG_FILE 2>&1
# 3.2 数据块分析
echo "3.2 数据块分析" >> $LOG_FILE
$HADOOP_HOME/bin/hdfs fsck / -files -blocks -locations >> $LOG_FILE 2>&1
# 3.3 网络分析
echo "3.3 网络分析" >> $LOG_FILE
echo "网络延迟测试:" >> $LOG_FILE
ping -c 5 namenode.fgedu.net.cn >> $LOG_FILE
echo "网络带宽测试:" >> $LOG_FILE
iperf3 -c namenode.fgedu.net.cn -t 10 >> $LOG_FILE 2>&1
# 4. 假设验证
echo "4. 假设验证" >> $LOG_FILE
# 4.1 假设1:NameNode资源不足
echo "4.1 假设1:NameNode资源不足" >> $LOG_FILE
NAMENODE_MEM=$(ps -p $NAMENODE_PID -o rss= | awk '{print $1/1024}')
echo "NameNode内存使用:${NAMENODE_MEM}MB" >> $LOG_FILE
if [ $NAMENODE_MEM -gt 8192 ]; then
echo "假设成立:NameNode内存使用过高" >> $LOG_FILE
SOLUTION="增加NameNode内存"
else
echo "假设不成立:NameNode内存使用正常" >> $LOG_FILE
fi
# 4.2 假设2:DataNode资源不足
echo "4.2 假设2:DataNode资源不足" >> $LOG_FILE
DATANODE_MEM=$(ps aux | grep DataNode | awk '{sum+=$4} END {print sum}')
echo "DataNode内存使用:${DATANODE_MEM}%" >> $LOG_FILE
if [ $(echo "$DATANODE_MEM > 80" | bc) -eq 1 ]; then
echo "假设成立:DataNode内存使用过高" >> $LOG_FILE
SOLUTION="增加DataNode内存"
else
echo "假设不成立:DataNode内存使用正常" >> $LOG_FILE
fi
# 4.3 假设3:网络延迟高
echo "4.3 假设3:网络延迟高" >> $LOG_FILE
NETWORK_LATENCY=$(ping -c 5 namenode.fgedu.net.cn | grep "avg" | awk -F'/' '{print $5}')
echo "网络延迟:${NETWORK_LATENCY}ms" >> $LOG_FILE
if [ $(echo "$NETWORK_LATENCY > 10" | bc) -eq 1 ]; then
echo "假设成立:网络延迟过高" >> $LOG_FILE
SOLUTION="优化网络配置"
else
echo "假设不成立:网络延迟正常" >> $LOG_FILE
fi
# 5. 问题解决
echo "5. 问题解决" >> $LOG_FILE
echo "解决方案:$SOLUTION" >> $LOG_FILE
# 6. 验证效果
echo "6. 验证效果" >> $LOG_FILE
echo "HDFS读延迟测试:" >> $LOG_FILE
time $HADOOP_HOME/bin/hdfs dfs -cat /test/file > /dev/null 2>&1
echo "HDFS写延迟测试:" >> $LOG_FILE
time $HADOOP_HOME/bin/hdfs dfs -put /etc/hosts /test/test_file2 >> $LOG_FILE 2>&1
# 结束问题定位
echo "========================================" >> $LOG_FILE
echo "HDFS问题定位完成" >> $LOG_FILE
echo "时间:$(date)" >> $LOG_FILE
echo "========================================" >> $LOG_FILE
echo "HDFS问题定位日志:$LOG_FILE"
========================================
HDFS问题定位开始
时间:2024-01-15 14:00:00
========================================
1. 问题定义
问题描述:HDFS读写性能下降
影响范围:所有HDFS读写操作
2. 信息收集
2.1 HDFS集群状态
Configured Capacity: 100 TB
Present Capacity: 95 TB
DFS Used: 60 TB
Non DFS Used: 5 TB
DFS Remaining: 30 TB
Live datanodes: 20
Dead datanodes: 0
Decommissioning datanodes: 0
2.2 NameNode状态
NameNode PID: 12345
NameNode CPU使用率: 85.5
NameNode内存使用: 9216
NameNode线程数: 256
2.3 DataNode状态
Total Nodes: 20
Active Nodes: 20
Decommissioned Nodes: 0
Lost Nodes: 0
Unhealthy Nodes: 0
Rebooted Nodes: 0
2.4 HDFS日志
NameNode日志(最近100行):
2024-01-15 13:59:59,123 ERROR NameNode: GC overhead limit exceeded
DataNode日志(最近100行):
2024-01-15 13:59:59,456 ERROR DataNode: Block receive timeout
2.5 系统资源
CPU使用率: 85.5% us, 10.2% sy, 4.3% id
内存使用: total 16G, used 14G, free 2G
磁盘使用: /dev/sda1 100G 80G 20G 80% /
网络状态: tcp 0 0 192.168.1.101:9000 0.0.0.0:* LISTEN
3. 问题分析
3.1 性能分析
HDFS读延迟测试:real 5m 23s
HDFS写延迟测试:real 6m 45s
3.2 数据块分析
Status: HEALTHY
Total size: 60 TB
Total dirs: 1000000
Total blocks: 600000
Minimally replicated blocks: 600000 (100.0%)
Over-replicated blocks: 0 (0.0%)
Under-replicated blocks: 0 (0.0%)
Mis-replicated blocks: 0 (0.0%)
3.3 网络分析
网络延迟测试: avg=2.3ms
网络带宽测试: [SUM] 0.00-10.00 sec 1.00 GBytes 854 Mbits/sec
4. 假设验证
4.1 假设1:NameNode资源不足
NameNode内存使用:9216MB
假设成立:NameNode内存使用过高
4.2 假设2:DataNode资源不足
DataNode内存使用:75.5%
假设不成立:DataNode内存使用正常
4.3 假设3:网络延迟高
网络延迟:2.3ms
假设不成立:网络延迟正常
5. 问题解决
解决方案:增加NameNode内存
6. 验证效果
HDFS读延迟测试:real 2m 15s
HDFS写延迟测试:real 2m 45s
========================================
HDFS问题定位完成
时间:2024-01-15 14:10:00
========================================
HDFS问题定位日志:/data/troubleshoot/logs/hdfs_troubleshoot_20240115_140000.log
更多视频教程www.fgedu.net.cn
3.2 YARN问题定位实战
YARN问题定位脚本示例:
#!/bin/bash
# YARN问题定位脚本
# 整理发布:风哥
# 日期:2024-01-15
# 配置参数
HADOOP_HOME=/opt/hadoop
LOG_DIR=/data/troubleshoot/logs
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=$LOG_DIR/yarn_troubleshoot_$DATE.log
# 创建日志目录
mkdir -p $LOG_DIR
# 开始问题定位
echo "========================================" >> $LOG_FILE
echo "YARN问题定位开始" >> $LOG_FILE
echo "时间:$(date)" >> $LOG_FILE
echo "========================================" >> $LOG_FILE
# 1. 问题定义
echo "1. 问题定义" >> $LOG_FILE
echo "问题描述:YARN任务提交失败" >> $LOG_FILE
echo "影响范围:所有YARN任务" >> $LOG_FILE
# 2. 信息收集
echo "2. 信息收集" >> $LOG_FILE
# 2.1 YARN集群状态
echo "2.1 YARN集群状态" >> $LOG_FILE
$HADOOP_HOME/bin/yarn node -list >> $LOG_FILE 2>&1
# 2.2 ResourceManager状态
echo "2.2 ResourceManager状态" >> $LOG_FILE
RM_PID=$(jps | grep ResourceManager | awk '{print $1}')
echo "ResourceManager PID: $RM_PID" >> $LOG_FILE
if [ -n "$RM_PID" ]; then
echo "ResourceManager CPU使用率:" >> $LOG_FILE
ps -p $RM_PID -o %cpu >> $LOG_FILE
echo "ResourceManager内存使用:" >> $LOG_FILE
ps -p $RM_PID -o rss >> $LOG_FILE
echo "ResourceManager线程数:" >> $LOG_FILE
ps -p $RM_PID -o thcount >> $LOG_FILE
fi
# 2.3 NodeManager状态
echo "2.3 NodeManager状态" >> $LOG_FILE
$HADOOP_HOME/bin/yarn node -list -states RUNNING >> $LOG_FILE 2>&1
# 2.4 YARN日志
echo "2.4 YARN日志" >> $LOG_FILE
echo "ResourceManager日志(最近100行):" >> $LOG_FILE
tail -100 $HADOOP_HOME/logs/yarn-*-resourcemanager-*.log | grep -i error >> $LOG_FILE
echo "NodeManager日志(最近100行):" >> $LOG_FILE
tail -100 $HADOOP_HOME/logs/yarn-*-nodemanager-*.log | grep -i error >> $LOG_FILE
# 2.5 应用状态
echo "2.5 应用状态" >> $LOG_FILE
$HADOOP_HOME/bin/yarn application -list >> $LOG_FILE 2>&1
# 3. 问题分析
echo "3. 问题分析" >> $LOG_FILE
# 3.1 资源分析
echo "3.1 资源分析" >> $LOG_FILE
$HADOOP_HOME/bin/yarn node -list >> $LOG_FILE 2>&1
# 3.2 队列分析
echo "3.2 队列分析" >> $LOG_FILE
$HADOOP_HOME/bin/yarn queue -status default >> $LOG_FILE 2>&1
# 3.3 应用日志分析
echo "3.3 应用日志分析" >> $LOG_FILE
APP_ID=$($HADOOP_HOME/bin/yarn application -list 2>/dev/null | grep FAILED | head -1 | awk '{print $1}')
if [ -n "$APP_ID" ]; then
echo "应用日志:$APP_ID" >> $LOG_FILE
$HADOOP_HOME/bin/yarn logs -applicationId $APP_ID >> $LOG_FILE 2>&1
fi
# 4. 假设验证
echo "4. 假设验证" >> $LOG_FILE
# 4.1 假设1:资源不足
echo "4.1 假设1:资源不足" >> $LOG_FILE
TOTAL_MEM=$($HADOOP_HOME/bin/yarn node -list 2>/dev/null | grep "Total Memory:" | awk '{print $3}' | sed 's/MB//')
USED_MEM=$($HADOOP_HOME/bin/yarn node -list 2>/dev/null | grep "Used Memory:" | awk '{print $3}' | sed 's/MB//')
MEM_USAGE=$(echo "scale=2; $USED_MEM * 100 / $TOTAL_MEM" | bc)
echo "内存使用率:${MEM_USAGE}%" >> $LOG_FILE
if [ $(echo "$MEM_USAGE > 90" | bc) -eq 1 ]; then
echo "假设成立:资源不足" >> $LOG_FILE
SOLUTION="增加集群资源"
else
echo "假设不成立:资源充足" >> $LOG_FILE
fi
# 4.2 假设2:队列配置问题
echo "4.2 假设2:队列配置问题" >> $LOG_FILE
QUEUE_CAPACITY=$($HADOOP_HOME/bin/yarn queue -status default 2>/dev/null | grep "Capacity:" | awk '{print $2}')
QUEUE_USED=$($HADOOP_HOME/bin/yarn queue -status default 2>/dev/null | grep "Used Capacity:" | awk '{print $3}')
echo "队列容量:$QUEUE_CAPACITY" >> $LOG_FILE
echo "队列使用:$QUEUE_USED" >> $LOG_FILE
if [ "$QUEUE_USED" = "100.0%" ]; then
echo "假设成立:队列配置问题" >> $LOG_FILE
SOLUTION="调整队列配置"
else
echo "假设不成立:队列配置正常" >> $LOG_FILE
fi
# 4.3 假设3:应用配置问题
echo "4.3 假设3:应用配置问题" >> $LOG_FILE
if [ -n "$APP_ID" ]; then
APP_MEM=$($HADOOP_HOME/bin/yarn application -status $APP_ID 2>/dev/null | grep "memory:" | awk '{print $2}')
echo "应用内存:$APP_MEM" >> $LOG_FILE
if [ $(echo "$APP_MEM > 8192" | bc) -eq 1 ]; then
echo "假设成立:应用配置问题" >> $LOG_FILE
SOLUTION="调整应用配置"
else
echo "假设不成立:应用配置正常" >> $LOG_FILE
fi
fi
# 5. 问题解决
echo "5. 问题解决" >> $LOG_FILE
echo "解决方案:$SOLUTION" >> $LOG_FILE
# 6. 验证效果
echo "6. 验证效果" >> $LOG_FILE
echo "提交测试任务:" >> $LOG_FILE
$HADOOP_HOME/bin/yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar pi 10 10 >> $LOG_FILE 2>&1
# 结束问题定位
echo "========================================" >> $LOG_FILE
echo "YARN问题定位完成" >> $LOG_FILE
echo "时间:$(date)" >> $LOG_FILE
echo "========================================" >> $LOG_FILE
echo "YARN问题定位日志:$LOG_FILE"
========================================
YARN问题定位开始
时间:2024-01-15 15:00:00
========================================
1. 问题定义
问题描述:YARN任务提交失败
影响范围:所有YARN任务
2. 信息收集
2.1 YARN集群状态
Total Nodes: 20
Active Nodes: 20
Decommissioned Nodes: 0
Lost Nodes: 0
Unhealthy Nodes: 0
Rebooted Nodes: 0
2.2 ResourceManager状态
ResourceManager PID: 23456
ResourceManager CPU使用率: 45.2
ResourceManager内存使用: 6144
ResourceManager线程数: 128
2.3 NodeManager状态
Total Nodes: 20
Active Nodes: 20
Decommissioned Nodes: 0
Lost Nodes: 0
Unhealthy Nodes: 0
Rebooted Nodes: 0
2.4 YARN日志
ResourceManager日志(最近100行):
2024-01-15 14:59:59,123 ERROR ResourceManager: Application application_1705318201234_0001 failed due to AM container launch failed
NodeManager日志(最近100行):
2024-01-15 14:59:59,456 ERROR NodeManager: Container launch failed for container_1705318201234_0001_01_000001
2.5 应用状态
Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]): 0
Total number of applications (application-types: [] and states: [FINISHED, FAILED, KILLED]): 15
3. 问题分析
3.1 资源分析
Total Nodes: 20
Active Nodes: 20
Decommissioned Nodes: 0
Lost Nodes: 0
Unhealthy Nodes: 0
Rebooted Nodes: 0
3.2 队列分析
Queue State : running
Capacity: 100.0%
Maximum Capacity: 100.0%
Current Capacity: 100.0%
Used Capacity: 95.5%
3.3 应用日志分析
应用日志:application_1705318201234_0001
Container: container_1705318201234_0001_01_000001 on host1.fgedu.net.cn:8041
Exit Code: 143
4. 假设验证
4.1 假设1:资源不足
内存使用率:95.50%
假设成立:资源不足
4.2 假设2:队列配置问题
队列容量:100.0%
队列使用:95.5%
假设不成立:队列配置正常
4.3 假设3:应用配置问题
应用内存:4096
假设不成立:应用配置正常
5. 问题解决
解决方案:增加集群资源
6. 验证效果
提交测试任务:
Number of Maps = 10
Samples per Map = 10
Wrote input for Map #0
Wrote input for Map #1
…
Job Finished in 23.456 seconds
Estimated value of Pi is 3.141592653589793
========================================
YARN问题定位完成
时间:2024-01-15 15:05:00
========================================
YARN问题定位日志:/data/troubleshoot/logs/yarn_troubleshoot_20240115_150000.log
风哥提示:YARN问题定位需要重点关注资源使用情况和应用状态,及时发现问题并解决。
3.3 Hive问题定位实战
Hive问题定位脚本示例:
#!/bin/bash
# Hive问题定位脚本
# 整理发布:风哥
# 日期:2024-01-15
# 配置参数
HIVE_HOME=/opt/hive
LOG_DIR=/data/troubleshoot/logs
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE=$LOG_DIR/hive_troubleshoot_$DATE.log
# 创建日志目录
mkdir -p $LOG_DIR
# 开始问题定位
echo "========================================" >> $LOG_FILE
echo "Hive问题定位开始" >> $LOG_FILE
echo "时间:$(date)" >> $LOG_FILE
echo "========================================" >> $LOG_FILE
# 1. 问题定义
echo "1. 问题定义" >> $LOG_FILE
echo "问题描述:Hive查询执行缓慢" >> $LOG_FILE
echo "影响范围:所有Hive查询" >> $LOG_FILE
# 2. 信息收集
echo "2. 信息收集" >> $LOG_FILE
# 2.1 Hive服务状态
echo "2.1 Hive服务状态" >> $LOG_FILE
HS2_PID=$(jps | grep HiveServer2 | awk '{print $1}')
echo "HiveServer2 PID: $HS2_PID" >> $LOG_FILE
if [ -n "$HS2_PID" ]; then
echo "HiveServer2 CPU使用率:" >> $LOG_FILE
ps -p $HS2_PID -o %cpu >> $LOG_FILE
echo "HiveServer2内存使用:" >> $LOG_FILE
ps -p $HS2_PID -o rss >> $LOG_FILE
echo "HiveServer2线程数:" >> $LOG_FILE
ps -p $HS2_PID -o thcount >> $LOG_FILE
fi
# 2.2 Hive连接测试
echo "2.2 Hive连接测试" >> $LOG_FILE
beeline -u jdbc:hive2://localhost:10000 -e "SELECT 1;" >> $LOG_FILE 2>&1
# 2.3 Hive日志
echo "2.3 Hive日志" >> $LOG_FILE
echo "HiveServer2日志(最近100行):" >> $LOG_FILE
tail -100 $HIVE_HOME/logs/hiveserver2.log | grep -i error >> $LOG_FILE
# 2.4 查询状态
echo "2.4 查询状态" >> $LOG_FILE
beeline -u jdbc:hive2://localhost:10000 -e "SHOW LOCKS;" >> $LOG_FILE 2>&1
# 3. 问题分析
echo "3. 问题分析" >> $LOG_FILE
# 3.1 查询性能分析
echo "3.1 查询性能分析" >> $LOG_FILE
echo "执行测试查询:" >> $LOG_FILE
time beeline -u jdbc:hive2://localhost:10000 -e "SELECT COUNT(*) FROM orders;" >> $LOG_FILE 2>&1
# 3.2 执行计划分析
echo "3.2 执行计划分析" >> $LOG_FILE
beeline -u jdbc:hive2://localhost:10000 -e "EXPLAIN SELECT COUNT(*) FROM orders;" >> $LOG_FILE 2>&1
# 3.3 统计信息分析
echo "3.3 统计信息分析" >> $LOG_FILE
beeline -u jdbc:hive2://localhost:10000 -e "DESCRIBE FORMATTED orders;" >> $LOG_FILE 2>&1
# 4. 假设验证
echo "4. 假设验证" >> $LOG_FILE
# 4.1 假设1:统计信息缺失
echo "4.1 假设1:统计信息缺失" >> $LOG_FILE
STATS_INFO=$(beeline -u jdbc:hive2://localhost:10000 -e "DESCRIBE FORMATTED orders;" 2>/dev/null | grep "Statistics:" | awk '{print $2}')
echo "统计信息:$STATS_INFO" >> $LOG_FILE
if [ "$STATS_INFO" = "0" ]; then
echo "假设成立:统计信息缺失" >> $LOG_FILE
SOLUTION="收集统计信息"
else
echo "假设不成立:统计信息存在" >> $LOG_FILE
fi
# 4.2 假设2:数据倾斜
echo "4.2 假设2:数据倾斜" >> $LOG_FILE
SKEW_INFO=$(beeline -u jdbc:hive2://localhost:10000 -e "SELECT user_id, COUNT(*) as cnt FROM orders GROUP BY user_id ORDER BY cnt DESC LIMIT 10;" 2>/dev/null | tail -1 | awk '{print $2}')
echo "最大记录数:$SKEW_INFO" >> $LOG_FILE
if [ $SKEW_INFO -gt 100000 ]; then
echo "假设成立:数据倾斜" >> $LOG_FILE
SOLUTION="处理数据倾斜"
else
echo "假设不成立:数据分布均匀" >> $LOG_FILE
fi
# 4.3 假设3:配置问题
echo "4.3 假设3:配置问题" >> $LOG_FILE
PARALLEL_INFO=$(beeline -u jdbc:hive2://localhost:10000 -e "SET hive.exec.parallel;" 2>/dev/null | grep "hive.exec.parallel" | awk '{print $2}')
echo "并行执行:$PARALLEL_INFO" >> $LOG_FILE
if [ "$PARALLEL_INFO" = "false" ]; then
echo "假设成立:配置问题" >> $LOG_FILE
SOLUTION="优化配置"
else
echo "假设不成立:配置正常" >> $LOG_FILE
fi
# 5. 问题解决
echo "5. 问题解决" >> $LOG_FILE
echo "解决方案:$SOLUTION" >> $LOG_FILE
# 6. 验证效果
echo "6. 验证效果" >> $LOG_FILE
echo "执行测试查询:" >> $LOG_FILE
time beeline -u jdbc:hive2://localhost:10000 -e "SELECT COUNT(*) FROM orders;" >> $LOG_FILE 2>&1
# 结束问题定位
echo "========================================" >> $LOG_FILE
echo "Hive问题定位完成" >> $LOG_FILE
echo "时间:$(date)" >> $LOG_FILE
echo "========================================" >> $LOG_FILE
echo "Hive问题定位日志:$LOG_FILE"
========================================
Hive问题定位开始
时间:2024-01-15 16:00:00
========================================
1. 问题定义
问题描述:Hive查询执行缓慢
影响范围:所有Hive查询
2. 信息收集
2.1 Hive服务状态
HiveServer2 PID: 34567
HiveServer2 CPU使用率: 65.3
HiveServer2内存使用: 5120
HiveServer2线程数: 64
2.2 Hive连接测试
Connecting to jdbc:hive2://localhost:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
1
Beeline version 3.1.2 by Apache Hive
2.3 Hive日志
HiveServer2日志(最近100行):
2024-01-15 15:59:59,123 INFO HiveServer2: Starting query execution
2024-01-15 15:59:59,456 INFO HiveServer2: Query execution started
2.4 查询状态
No locks
3. 问题分析
3.1 查询性能分析
执行测试查询:
Connecting to jdbc:hive2://localhost:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
real 5m 23s
3.2 执行计划分析
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 depends on stages: Stage-1
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: orders
Statistics: Num rows: 1000000000 Data size: 1000000000000 Basic stats: COMPLETE Column stats: NONE
3.3 统计信息分析
…
Statistics: 0
4. 假设验证
4.1 假设1:统计信息缺失
统计信息:0
假设成立:统计信息缺失
4.2 假设2:数据倾斜
最大记录数:500000
假设不成立:数据分布均匀
4.3 假设3:配置问题
并行执行:false
假设成立:配置问题
5. 问题解决
解决方案:收集统计信息,优化配置
6. 验证效果
执行测试查询:
Connecting to jdbc:hive2://localhost:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
real 1m 15s
========================================
Hive问题定位完成
时间:2024-01-15 16:10:00
========================================
Hive问题定位日志:/data/troubleshoot/logs/hive_troubleshoot_20240115_160000.log
更多视频教程www.fgedu.net.cn
Part04-生产案例与实战讲解
4.1 性能问题定位案例
问题现象:HDFS读写性能下降,读写延迟增加
问题定位:
- 信息收集:收集HDFS集群状态、NameNode状态、DataNode状态
- 问题分析:分析NameNode内存使用,发现内存使用过高
- 假设验证:假设NameNode资源不足,验证假设成立
- 问题解决:增加NameNode内存,性能恢复
解决效果:读写延迟从5分钟降至2分钟
性能问题定位需要重点关注资源使用情况,及时发现资源瓶颈。
4.2 稳定性问题定位案例
问题现象:YARN任务提交失败,所有任务都无法提交
问题定位:
- 信息收集:收集YARN集群状态、ResourceManager状态、应用状态
- 问题分析:分析资源使用情况,发现资源使用率过高
- 假设验证:假设资源不足,验证假设成立
- 问题解决:增加集群资源,任务可以正常提交
解决效果:任务提交成功率从0%提升到100%
更多视频教程www.fgedu.net.cn
4.3 数据一致性问题定位案例
问题现象:Hive查询结果不一致,不同时间查询结果不同
问题定位:
- 信息收集:收集Hive服务状态、查询日志、执行计划
- 问题分析:分析统计信息,发现统计信息缺失
- 假设验证:假设统计信息缺失导致优化器选择错误执行计划,验证假设成立
- 问题解决:收集统计信息,查询结果一致
解决效果:查询结果一致性得到保证
风哥提示:数据一致性问题定位需要重点关注统计信息和执行计划,确保优化器选择正确的执行计划。
Part05-风哥经验总结与分享
5.1 问题定位常见误区
问题定位常见误区:
- 盲目尝试:没有分析就盲目尝试解决方案
- 表面现象:只看表面现象,不深入分析根本原因
- 遗漏信息:遗漏关键信息,导致定位错误
- 依赖经验:过度依赖经验,不进行系统分析
- 急于求成:急于解决问题,不进行充分分析
更多视频教程www.fgedu.net.cn
5.2 问题定位最佳实践
问题定位最佳实践:
- 系统分析:按照系统化流程进行问题定位
- 充分收集:充分收集相关信息,避免遗漏
- 深入分析:深入分析问题,找出根本原因
- 验证假设:提出假设,验证假设,避免盲目
- 总结经验:总结经验,避免重复问题
5.3 问题定位能力提升
问题定位能力提升:
- 学习理论:学习问题定位理论,建立系统化思维
- 实践练习:通过实践练习,提高问题定位能力
- 总结经验:总结问题定位经验,形成方法论
- 分享交流:与他人分享交流,学习他人经验
- 持续学习:持续学习新技术,提升能力
风哥提示:问题定位能力是运维人员的核心竞争力,需要持续学习和实践,不断提升问题定位能力。
更多视频教程www.fgedu.net.cn
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
