|
通过上面的讨论,DataNode上的读/写流程已经基本清楚了。我们来看下一个非主流流程,
DataBlockScanner用于定时对数据块文件进行校验。类图如下:

DataBlockScanner拥有它单独的线程,能定时地从目前DataNode管理的数据块文件进行校验。其实最重要的方法就是verifyBlock,我们来看这个方法最关键的地方:
blockSender = new BlockSender(block, 0, -1, false, false, true, datanode);
DataOutputStream out = new DataOutputStream(new IOUtils.NullOutputStream());
blockSender.sendBlock(out, null, throttler);
校验利用了BlockSender,因为我们知道BlockSender中,发送数据的同时,会对数据进行校验。verifyBlock只需要读一个Block到一个空输出设备(NullOutputStream),如果有异常,那么校验失败,如果正常,校验成功。
DataBlockScanner其他的辅助方法用于对DataBlockScanner管理的数据块文件信息进行增加/删除,排序操作。同时,校验的信息还会保持在Storage上,保存在dncp_block_verification.log.curr和dncp_block_verification.log.prev中。 |
|
|