-
- 态);若为 YARN 节点,重启 NodeManager 后手动将其加入集群。
- 若为节点整体宕机:排查电源和网络,重启节点后,依次启动 HDFS、YARN 等服务进程,确认数据块完整性(避免因节点宕机导致副本不足)。
2. 网络问题
- 现象:节点间通信超时(如 HDFS 心跳超时、YARN 任务调度延迟)、数据传输卡顿。
- 可能原因:交换机故障、网线松动、网络带宽过载、防火墙规则拦截。
- 处理方式 :
- 用
ping
、traceroute
检查节点间连通性,ifconfig
确认网卡状态,ethtool
查看网卡速率。 - 若带宽过载:通过
iftop
定位流量来源(如大量 Spark Shuffle、Hive 查询),临时限制高消耗任务,或扩容网络带宽。 - 若防火墙问题:关闭不必要的防火墙规则(如
systemctl stop firewalld
),或开放集群通信端口(如 HDFS 的 50070、YARN 的 8088 等)。
- 用
二、HDFS 相关问题
1. 数据块丢失或损坏(Block Missing/Corrupt)
- 现象 :
hdfs dfsadmin -report
显示 "Missing blocks",或 Hive/Spark 查询时报 "BlockNotFoundException"。 - 可能原因:节点宕机导致副本不足、硬盘损坏、数据写入时网络中断。
- 处理方式 :
- 若节点宕机:重启节点后,HDFS 会自动复制缺失的块(需确保副本数
dfs.replication
配置合理,通常为 3)。 - 若块损坏:通过
hdfs fsck /
定位损坏路径,执行hdfs fsck /path -delete
删除损坏文件(需确认文件可重建),或从备份恢复。 - 长期预防:定期执行
hdfs fsck /
检查块状态,设置dfs.namenode.replication.min
为 1(避免副本数为 0 导致块丢失)。
- 若节点宕机:重启节点后,HDFS 会自动复制缺失的块(需确保副本数
2. NameNode 内存溢出或响应缓慢
- 现象 :NameNode 进程频繁崩溃,日志中出现 "OutOfMemoryError",或 HDFS 操作(如
ls
、put
)卡顿。 - 可能原因:集群文件数量过多(每个文件元数据占用 NameNode 内存)、JVM 堆内存配置不足。
- 处理方式 :
- 调整 NameNode 堆内存:在
hadoop-env.sh
中增大HADOOP_NAMENODE_OPTS
(如-Xmx40g
,根据文件数估算,通常每百万文件约需 1GB 内存)。 - 清理无用文件:删除过期数据(如
hdfs dfs -rm -r /tmp/*
),合并小文件(通过 Hive 的INSERT OVERWRITE
或专门的小文件合并工具),减少元数据总量。 - 启用 NameNode HA:避免单点故障,同时通过 Standby NameNode 分担读压力。
- 调整 NameNode 堆内存:在
三、YARN 与计算资源问题
1. 资源不足(内存 / CPU)
- 现象:YARN 任务提交失败,日志显示 "Container is running beyond memory limits",或节点资源使用率长期 100%。
- 可能原因:任务申请资源超过节点上限、资源配置不合理、集群资源未充分利用。
- 处理方式 :
- 调整任务资源参数:Spark 任务设置
--executor-memory
、--num-executors
;YARN 容器配置yarn.scheduler.maximum-allocation-mb
(单容器最大内存)和yarn.nodemanager.resource.memory-mb
(节点总内存)。 - 启用资源隔离:通过 Cgroups 限制容器 CPU / 内存使用,避免单个任务抢占全部资源。
- 扩容集群:若长期资源不足,新增节点并加入 YARN 集群(修改
yarn-site.xml
后重启 ResourceManager)。
- 调整任务资源参数:Spark 任务设置
2. 任务卡死或失败(Container killed)
- 现象:YARN UI 显示任务 "FAILED",日志报 "Container killed on request. Exit code is 143"(内存溢出)或 "Exit code 137"(被 OS OOM killer 杀死)。
- 可能原因:任务内存泄漏、Shuffle 数据量过大、节点资源被抢占。
- 处理方式 :
- 检查任务日志:通过 YARN UI 的 "Logs" 查看具体错误,定位内存溢出的代码(如 Spark RDD 持久化未释放、Hive UDF 内存泄漏)。
- 优化任务参数:增加 Executor 内存(
--executor-memory
)、调整 Shuffle 分区数(spark.sql.shuffle.partitions
),避免数据倾斜(用group by
前先采样分桶)。 - 检查 OS OOM:查看
/var/log/messages
,若有 "Out of memory: Kill process",说明节点物理内存不足,需限制单节点任务数或扩容内存。
四、YARN/Spark 任务调度问题
1. 任务排队等待时间过长
- 现象:任务提交后长时间处于 "ACCEPTED" 状态,无法进入 "RUNNING"。
- 可能原因:资源队列配置不合理(如队列资源配额不足)、调度策略不匹配(如 FIFO 调度下被大任务阻塞)。
- 处理方式 :
- 调整队列配置:在
capacity-scheduler.xml
中为业务队列分配足够资源(yarn.scheduler.capacity.<queue>.capacity
),设置最大资源占比(maximum-capacity
)避免单队列独占资源。 - 更换调度器:从 FIFO 改为 Capacity Scheduler 或 Fair Scheduler,实现多队列资源隔离与公平分配。
- 优先级管理:通过
yarn application -setPriority
调整任务优先级,紧急任务优先执行。
- 调整队列配置:在
五、Kafka 相关问题
1. 分区副本同步失败(Under-Replicated Partitions)
- 现象:Kafka Manager 显示 "Under-Replicated Partitions",或消费者消费数据延迟增大。
- 可能原因:Broker 节点宕机、副本所在节点网络不通、磁盘 I/O 繁忙导致同步延迟。
- 处理方式 :
- 检查 Broker 状态:通过
kafka-topics.sh --describe --topic <topic> --zookeeper <zk-host>
查看副本分布,确认是否有节点离线。 - 修复网络或重启节点:若节点正常,重启 Kafka 进程(
kafka-server-start.sh
),等待副本同步(通过kafka-consumer-groups.sh
监控 Lag)。 - 调整参数:增大
replica.fetch.max.bytes
(副本同步最大字节数)、num.replica.fetchers
(副本拉取线程数),加速同步。
- 检查 Broker 状态:通过
2. 磁盘空间不足导致数据写入失败
- 现象:Producer 报 "NotEnoughReplicasException",Broker 日志显示 "Disk full"。
- 可能原因 :Kafka 数据保留时间过长(
log.retention.hours
)、Topic 分区数过多、磁盘容量不足。 - 处理方式 :
- 清理过期数据:手动删除旧日志(
rm -rf /kafka/logs/<topic>-<partition>/00000*
),或修改log.retention.hours
(如从 72 小时改为 24 小时),重启 Broker 生效。 - 扩容磁盘:挂载新磁盘,将 Kafka 日志目录(
log.dirs
)迁移到新磁盘,重启 Broker。
- 清理过期数据:手动删除旧日志(
六、监控与告警问题
1. 集群监控数据延迟或丢失
- 现象:Grafana/Prometheus 面板数据停滞,或告警不触发。
- 可能原因:监控 Agent(如 Node Exporter、JMX Exporter)挂掉、数据传输链路中断(如 Prometheus 与 Pushgateway 连接失败)。
- 处理方式 :
- 检查 Agent 状态:
systemctl status node_exporter
,重启异常进程(systemctl restart node_exporter
)。 - 确认网络:Prometheus 服务器与集群节点的 9100(Node Exporter)、9999(JMX Exporter)端口是否连通,修复防火墙或网络配置。
- 检查 Agent 状态:
七、通用运维技巧与预防措施
-
自动化工具:
- 用 Ansible 批量部署 / 重启服务,避免手动操作失误。
- 用 Shell 脚本定期执行健康检查(如 HDFS 块状态、节点存活),输出异常报告。
-
日志管理:
- 集中收集日志(如 ELK Stack),快速定位问题(如通过 Kibana 搜索 "OutOfMemory")。
- 定期清理日志文件(如
logrotate
配置 Hadoop/Kafka 日志轮转),避免占满磁盘。
-
容量规划:
- 定期评估集群资源(CPU、内存、磁盘)使用率,提前扩容(如新增节点、升级硬件)。
- 对 HDFS,预留 30% 以上空闲磁盘空间,避免因磁盘满导致写入失败。
-
灾备策略:
- 定期备份关键数据(如 Hive 元数据 MySQL、NameNode 元数据),通过
hdfs dfs -copyToLocal
备份重要目录到本地。 - 配置多可用区部署,避免单机房故障导致集群瘫痪。
- 定期备份关键数据(如 Hive 元数据 MySQL、NameNode 元数据),通过