作者:Paul_Zhao | 来源:互联网 | 2023-06-14 16:32
1、现象说明早上,客户反映某些日期的历史数据查询不出来(我们系统将历史的汇总数据是保存到Hbase中),从查询端的日志看查询失败(查询端是erlang写的分布式查询引擎)。erlang是通过
1、现象说明
早上,客户反映某些日期的历史数据查询不出来(我们系统将历史的汇总数据是保存到Hbase中),从查询端的日志看查询失败(查询端是erlang写的分布式查询引擎)。erlang是通过HBase提供的thrift 服务接口来查询hbase的,所以进一步去查看thrift server的日志信息,发现如下的错误:
备注:并不是所有的查询都失败,只有某些站点的某些日期的数据查询失败。
2、问题的排查和定位
从日志Caused by: java.io.IOException: Failed to read compressed block at 212328226 和 Caused by: java.io.IOException: Invalid HFile block magic: 可以初步判断应该是底层保存的文件出现了问题。
(1)首先登录到NameNode web界面,查看是否有corrupted的block的问题,发现一切正常
(2)然后登录到Hbase的web界面,查看对应的表sum_profile_non_filter_olap_d是否正常,发现一切正常
(3)然后运行一下hbase hbck查看是否有不一致的问题,发现也一切正常
(4)进一步使用hdfs fsck来检查上面出错的信息所对应的文件,发现一切正常
(5)根据(4)的输出来定位报错的文件的所有block所在的机器,登录到这些机器上,然后分别查看hbase region server和datanode 的日志,但是并未发现到任何的异常输出
(6)根据1-5,排除了HDFS和Hbase服务的异常情况,唯一剩下的就是服务器的硬件问题了。根据上面的报错信息,怀疑是磁盘出现了问题,但是磁盘出问题会报警啊?
使用下面的命令来查看磁盘的健康情况:
smartctl -H /dev/sdc
[root@dn-5-45 ~]# smartctl -H /dev/sdj
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-504.16.2.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net
SMART Health Status: FAILURE PREDICTION THRESHOLD EXCEEDED: ascq=0x5 [asc=5d, ascq=5]
终于找到原因了,原来是磁盘有了坏道。。。。(线上的集群已经运行快三年了,出现磁盘坏道的问题也算正常)
3、问题的解决
对于低版本的hadoop,只能将对应的磁盘从dfs.datanode.data.dir目录上去除掉,然后重启DataNode来生效。
最新版本的hadoop引入了-reconfig来动态的更新结点的配置信息。
(1)将出错的磁盘对应的目录从dfs.datanode.data.dir配置项上去除掉
(2)使用下面的命令来让DataNode重新加载配置文件(注意端口号为:50020)
sudo -u hdfs hdfs dfsadmin -reconfig datanode dn-5-45.ptfuture.com:50020 start
(3)使用下面的命令来确定reconfig是否执行完成
sudo -u hdfs hdfs dfsadmin -reconfig datanode dn-5-45.ptfuture.com:50020 status
4、执行完上面操作之后,客户端查询一切恢复正常
备注:为什么磁盘出问题了,没有报警呢?登录到监控系统,发现磁盘的监控是有warn提醒的,只是当前的监控级别针对该warn并未发出报警信息,通知运维同学补充上对应的监控信息。