hadoop corrupt处理流程

Datanode block corrupt流程说明

1、 Datanode上有一个线程DataBlockScannerDatanode上面的block进行数据校验,其中该类中最重要的方法是verifyBlock(Block block),在verifyBlock(Block block)方法中利用了BlockSender,其方法是将block读入到一个空设备(IOUtils.NullOutputStream())中,通过读写进行检验。

2、  如果检验失败后handleScanFailure(Block block),通过RPC直接向Namenode汇报存在坏块,即调用NamenodereportBadBlocks(blocks)方法

3、NamenodeFSNamesystem转发调用markBlockAsCorrupt(Block blk,DatanodeInfo dn),经过校验后将该block放置入neededReplications结构中,至此DatanodeNamenode汇报结束

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、  最后修改corruptblock对应的DatanodeDescriptor状态,将该block置入invalidate队列中

9、  再下一次心跳汇报时,会将对应的blockDatanodeCommand的形式,发送给datanode进行处理

 

 

 

注:集群中主机数需要大于相应副本数才会进行复制,对corrupt进行处理,否则第6步找不出目的主机

猜你喜欢

转载自sid1211.iteye.com/blog/1134072
今日推荐