前言
最近在工作中解决了一个慢磁盘的问题,个人感觉整个发现-分析-解决的过程还是非常有意思并且很有意义的.而且磁盘监控在目前的Hadoop中还是没有做的很全的,大多数都是对Datanode,可以说这是1个盲区.其实想一想,hadoop自身不做这方面的监控也合理,因为像这种问题基本上是属于硬件问题,本不应该在软件层面对其进行监控,没有这么大的必要.但是后来我们想了想,如果通过软件层面的监控手段发现机器硬件上的问题也不错,至少能发现问题,何乐而不为呢.下面进入文章的正题.
慢磁盘
在这里我姑且用这个名词来解释这个现象,用专业点的英文术语说应该是slow-writed disk,译为写入操作很慢的磁盘,写操作主要包括创建文件,目录,写文件这些操作.而慢磁盘的理解就是进行这些写操作耗时远远超出平均值时间的磁盘.我们在最近就碰到了这样的场景,其他正常的盘基本上创建1个Test目录,只需1/10或者快的1/100秒左右的时间,而我惊奇的发现有块盘竟然花了5分钟左右,而且更奇怪的是,有的时候会出现有的时候又不会出现这样的现象.一旦出现了慢磁盘,将会严重拖慢这个节点的整体运行效率,继而让此节点成为集群中的慢节点,最后影响整个集群.那么问题来了,既然慢磁盘这么重要,我们怎么准确定位到哪台机器的哪块磁盘有问题的,那么多个节点,每个节点上又有那么多块盘.
慢磁盘的发现
下面教大家几个方法:
1.通过心跳未联系次数.一般如果出现慢磁盘现象,会影响到datanode与namenode的心跳,这个值会变得很大.
2.通过ganglia对datanode写操作相关的监控,这个是传统的方式.
对比几个特殊的节点观察时间有没有特别长的.
当然以上是确定可疑慢磁盘所在节点,假设异常节点已经发现,下面是怎么发现上面的慢磁盘,这个方法不用想的那么复杂,这里提供最简单的方法,写1个脚本,在所有的磁盘上执行
time mkdir test
rm -r -f test
观察哪个磁盘所花的时间最长就可以了.当然你想用Linux工具专门的检查磁盘读写性能的命令,当然最好了.
慢磁盘监控
上面提供的方法在使用性和准确性方面还是存在许多偏差的,尤其是在寻找慢磁盘的方法上,因此最权威的方法还是在hadoop层面对每个磁盘进行写操作的时间进行监控,这无疑是最准的,所以我们要加自定义的Metrics代码,下面简单介绍一下我们是如何对此进行改造的.首先要明白一定的原理,datanode写磁盘对应的关系是<