HDFS源码分析(6):datanode DataBlockScanner

March 29, 2012 / DataBlockScanner, datanode, Hadoop, HDFS, source

前提

Hadoop版本:hadoop-0.20.2

概述

DataBlockScanner是datanode上很重要的部分,用于周期性地对块文件进行校验,当客户端读取整个块时,也会通知DataBlockScanner校验结果。这个类位于包org.apache.hadoop.hdfs.server.datanode中,与DataBlockScanner相关的类图如下所示:

相关参数

与扫描相关的参数有:

与扫描日志相关的参数有:

采用滚动日志方式,只有当前行数curNumLines超过最大行数maxNumLines,并且距离上次滚动日志的时间 超过minRollingPeriod时,才将dncp_block_verification.log.curr重命名为dncp_block_verification.log.prev,将新的日志写到dncp_block_verification.log.curr中。

扫描过程

块的信息用BlockScanInfo来表示,在比较时先对比最后扫描时间,如果扫描时间一样,再比较块的信息,这样,能保证从blockInfoSet中取出的第一个元素的最后扫描时间距离现在最久。

将块添加到扫描集合中时,为其在上个扫描周期中随机选择一个时间作为最后扫描时间,避免所有块在同一时间进行扫描。

扫描的过程如下:

除了DataBlockScanner本身会校验块,DataXceiver在处理读请求时,如果读取整个块的数据,也对块进行校验,并通知DataBlockScanner校验结果。DataXceiver在处理写请求时,将块写入磁盘后,会将块添加到扫描列表中。

后记

文中若有错误或疏漏之处,烦请批评指正。