手上管理的其中一个Hadoop集群,承接着大量的数据流量,一直以来运行平稳,最近突然发现集群有时会出现MR作业运行缓慢,put文件至HDFS偶发速度慢的问题,像大数据集群这种问题,有点疑难杂症的味道,本次也是经历了10多个小时的定位才真正把问题解决。
hdfs fsck –block FILENAME –files –blocks -locations
egrep -o “Slow.?(took|cost)” hdfs/log | sort | uniq -c
,发现Slow BlockReceiver write packet to mirror took
提示远高于其他信息,初步判定是网络问题;
Slow 日志记录
Slow BlockReceiver write packet to mirror took
的信息,发现某几个的Slow BlockReceiver write packet to mirror took
提示明显高于其他节点,达到100多万,该批节点很有可能存在问题。此处需要说明:如果所有节点的Slow日志大致一样,那无法说明问题;
部分节点Slow日志过多
ping –s
指定包的大小,否则无法测出丢包率,谨记;丢包严重
既然是交换机带来的网络问题,自然是通过修复交换机硬件故障来解决。 本次运维事件也暴露出了网络运维同事对交换机监控的不足,如果网络侧能够及时发现交换机硬件故障,也不会对上层集群产生这么大的影响。
虽然故障原因很简单,但是本案例的分析过程值得我们总结。事后我对Hadoop源码提示Slow BlockReceiver write packet to mirror
警告的代码段进行了分析,发现其为数据块横向复制过程中超时所打印,证实了前面的猜想。
//First write the packet to the mirror:
if (mirrorOut != null && !mirrorError) {
try {
long begin = Time.monotonicNow();
packetReceiver.mirrorPacketTo(mirrorOut);
mirrorOut.flush();
long duration = Time.monotonicNow() - begin;
if (duration > datanodeSlowLogThresholdMs) {
LOG.warn("Slow BlockReceiver write packet to mirror took " + duration
+ "ms (threshold=" + datanodeSlowLogThresholdMs + "ms)");
}
} catch (IOException e) {
handleMirrorOutError(e);
}
}
源码地址:
https://github.com/apache/hadoop/blob/master/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockReceiver.java
同时,我们可以总结到: