hadoop corrupt处理流程
?
1、 Datanode上有一个线程DataBlockScanner对Datanode上面的block进行数据校验,其中该类中最重要的方法是verifyBlock(Block block),在verifyBlock(Blockblock)方法中利用了BlockSender,其方法是将block读入到一个空设备(IOUtils.NullOutputStream())中,通过读写进行检验。
2、 ?如果检验失败后handleScanFailure(Blockblock),通过RPC直接向Namenode汇报存在坏块,即调用Namenode的reportBadBlocks(blocks)方法
3、Namenode向FSNamesystem转发调用markBlockAsCorrupt(Block blk,DatanodeInfo dn),经过校验后将该block放置入neededReplications结构中,至此Datanode向Namenode汇报结束
4、 ?Namenode通过ReplicationMonitor线程,对block出现的问题(excess,neededreplica…)进行处理。该线程调用computeDatanodeWork()方法,该方法首先调用computeReplicationWork()方法。
5、 ?在computeReplicationWork()方法中,从neededReplicaions结构中按照优先级构建出需要复制的block—blocksToReplicate,对每个block调用computeReplicationWorkForBlock()方法
6、 ?随后调用ReplicationTargetChooser类的chooseTarget去获取目的主机,用于放置block
7、 ?随后更改6中获得的DatanodeDescriptor的状态,将该block放置入需要replicate的队列中,同时pendingReplications加入该block准备复制
8、 ?最后修改corrupt的block对应的DatanodeDescriptor状态,将该block置入invalidate队列中
9、 ?再下一次心跳汇报时,会将对应的block已DatanodeCommand的形式,发送给datanode进行处理
?
?
?
注:集群中主机数需要大于相应副本数才会进行复制,对corrupt进行处理,否则第6步找不出目的主机
?