1、首先,我看的是hadoop1.2.1
这个里边,有点奇怪ClientDatanodeProtocol的versionID是4,但是InterDatanodeProtocol的versionID是3,
而且这两个还不再同一个包下,InterDatanodeProtocol位于org.apache.hadoop.hdfs.server.protocol下,而ClientDatanodeProtocol位于org.apache.hadoop.hdfs.protocol下
2、ClientDatanodeProtocol里边的三个方法
LocatedBlock recoverBlock(Block block, boolean keepLength,
DatanodeInfo[] targets) throws IOException;
Block getBlockInfo(Block block) throws IOException;
BlockLocalPathInfo getBlockLocalPathInfo(Block block,
Token<BlockTokenIdentifier> token) throws IOException;
recoverBlock,getBlockInfo,getBlockLocalPathInfo
3、InterDatanodeProtocol里边的三个方法
BlockMetaDataInfo getBlockMetaDataInfo(Block block) throws IOException;
BlockRecoveryInfo startBlockRecovery(Block block) throws IOException;
void updateBlock(Block oldblock, Block newblock, boolean finalize) throws IOException;
getBlockMetaDataInfo,startBlockRecovery,updataBlock
4、很明显,两个协议都可以恢复Block,都可以获取Block的一些信息
不同的是ClientDatanodeProtocol获取的信息是为了下载,而InterDatanodeProtocol里边获取的信息是为了同步,也就是updataBlock
5、BlockMetaDataInfo继承至Block,
只多加了一个属性 private long lastScanTime;
6、BlockRecoveryInfo这个类也很简单
private Block block;
private boolean wasRecoveredOnStartup;
7、看来看去,都绕不开一个类,哪个类呢?Block
这个类也就是
private long blockId;
private long numBytes;
private long generationStamp;
三个核心属性,ID,大小,生成的时间戳
这里边有两个方法很有意思
/**
* 判断是否是一个block的名字
*/
public static boolean isBlockFilename(File f) {
String name = f.getName();
if ( name.startsWith( "blk_" ) &&
name.indexOf( ‘.‘ ) < 0 ) {
return true;
} else {
return false;
}
}
static long filename2id(String name) {
return Long.parseLong(name.substring("blk_".length()));
}
这你也就明白了,后台生成的文件为什么是blk_开头的了