2016年一月月 发布的文章

[HADOOP问题] DataNode日志中出现Input/output error

场景是这样的,有些用户因为某些原因将几个目录的副本从3降为1(一般情况下是不建议这么做的),后来出现丢块后,在把副本升为2了,后来还是出现文件无法读取这种情况:

****/user/username/fileName-000xx.lzo                                                      
0. BP-1422437282658:blk_1344672165_270983563 len=134217728 repl=2 [host1:50010, host3:50010]
1. BP-1422437282658:blk_1344672816_270984214 len=134217728 repl=1 [host11:50010]
2. BP-1422437282658:blk_1344672898_270984296 len=134217728 repl=2 [host19:50010, host16:50010]

对于NameNode来说,他是感知这个块是正常的,从datanode的日志看出,该datanode一直进行块复制操作,但每次想把这个块复制出去时,却出现了以下异常:

java.io.IOException: Input/output error
at sun.nio.ch.FileChannelImpl.transferTo0(Native Method)
at sun.nio.ch.FileChannelImpl.transferToDirectly(FileChannelImpl.java:433)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:565)
at org.apache.hadoop.net.SocketOutputStream.transferToFully(SocketOutputStream.java:223)

然后我们通过locate这个块所在的目录,进行了scp操作,还是出现了Input/output error,意味着这个块是无法完整读取的,所以我们进行了fsck了那个磁盘进行修复,因为磁盘问题导致无法读取,所以对这个并无太大影响,毕竟副本为1是风险很大的,所以那个文件是恢复不了了。

另外一个场景是集群有些datanode因为报block pool BP-1337805335-XXX-1422437282658 is not found,造成在联邦模式下有些NS显示为live节点,有些NS为dead节点,但是block pool在那个data盘是存在的

2016-01-15 21:30:48,225 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: IOException in offerService
java.io.IOException: block pool BP-1337805335-XXX-1422437282658 is not found
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsVolumeImpl.getBlockPoolSlice(FsVolumeImpl.java:122)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsVolumeImpl.getBlockPoolUsed(FsVolumeImpl.java:92)
at org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.FsVolumeList.getBlockPoolUsed(FsVolumeList.java:74)

这些节点的数据量比较大,因为死了比较久,而且副本为3的情况下,把一个DataNode停止是不会影响集群的,后来进行了fsck的操作,发现一个盘有问题,并修复了,后来启动datanode,节点也再也没有死了,fsck这个命令请在专业的人指导下面操作把,毕竟数据安全为最重要。

[HADOOP] Unknown error encountered while tailing edits. Shutting down standby NN.

前段时间,standby的NN挂掉了,并且怎么起也起不来,如下日志:

2016-01-03 14:04:19,293 FATAL org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer: Unknown error encountered while tailing edits. Shutting down standby NN.
java.io.IOException: Failed to apply edit log operation ReassignLeaseOp [leaseHolder=DFSClient_NONMAPREDUCE_854707399_1, path=/tmp/jrdw/kafka2hdfs/log_mobile_gateway-21-1443245603647--6536501137915724876, newHolde
r=HDFS_NameNode, opCode=OP_REASSIGN_LEASE, txid=20790808505]: error File is not under construction: /tmp/jrdw/kafka2hdfs/log_mobile_gateway-21-1443245603647--6536501137915724876
       at org.apache.hadoop.hdfs.server.namenode.MetaRecoveryContext.editLogLoaderPrompt(MetaRecoveryContext.java:94)
       at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadEditRecords(FSEditLogLoader.java:205)
       at org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.loadFSEdits(FSEditLogLoader.java:112)
       at org.apache.hadoop.hdfs.server.namenode.FSImage.loadEdits(FSImage.java:771)
       at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer.doTailEdits(EditLogTailer.java:227)
       at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread.doWork(EditLogTailer.java:321)
       at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread.access$200(EditLogTailer.java:279)
       at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread$1.run(EditLogTailer.java:296)
       at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:456)
       at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread.run(EditLogTailer.java:292)

刚开始怀疑是不是editlog的下载有问题,后来发现editlog是可以解析出来的,但是不排除editlog的顺序存在bug

我们采取的方案是:

因为每次启动都需要加载editlog,所以为了跳过此操作,我们将Active进入安全模式,并进行saveNameSpace将dump出来的fsimage和txid拷贝到Standby NN上,重启就可以避免加载editlog了。

如果两个NN都挂掉了,那就要做相对麻烦的操作了,而且相对对数据不安全

以下是参考案例:

Namenode异常停止后无法正常启动