今天正式开始hadoop源码学习,此前chang'shi尝试过hadoop3源码阅读,无奈发展到3,源码已过于复杂,难以看懂,于是尝试haddop0.1.1.2源码学习,发现虽然时隔jiu'y久远,设计思想上还是一脉相承。今天来看DataNode类
DataNode 类实现了 FSConstants(FS常数)和Runnable接口,FSConstants来自于同一包下。FSConstants定义了许多常数,第一个是MIN_BLOCKS_FOR_WRITE(最小的可写块 ), 还有诸多基于不同客户分别和NameNode和DataNode之间交互的信号量以及一些常量值,下面是FSConstants接口的部分代码,有很多熟悉的常量值。
DataNode 第一个静态变量是org.apache.commons.logging.Log对象,估计用于DataNode的日志记录
定义了一个静态方法public static InetSocketAddress createSocketAddr(String target ) throws IOException
target为符合规则的ip地址及端口号信息,该方法主要用于将一个地址字符串转化为一个java.net.InetSocketAddress
DatanodeProtocol namenode; 数据节点协议,用于向NameNode上传信息与报告块信息,这也是NameNode和DataNode的唯一通信方式。
DatanodeProtocol接口中主要包含了register方法(如果DataNode没有注册ID则为其返回一个ID) sendHeartbeat方法(告诉NameNode它还存活) public Block[] blockReport(向NameNode报告所有本地块) blockReceived (向NameNode报告最新写入块)
errorReport(用在debug中,向namenode报告错误信息)
FSDataset data; FS数据集,控制着整个Data数据集,每个块都有独特的名字存储在磁盘上。
DatanodeRegistration dnRegistration; DataNode注册,包含了DataNode向NameNode通信完整的认证信息,该信息由Datanode随每个通信请求发送。
boolean shouldRun = true;
Vector receivedBlockList = new Vector();
int xmitsInProgress = 0;
Daemon dataXceiveServer = null;
long blockReportInterval; 块数据报告间隔
long heartBeatInterval; 心跳时间间隔
private DataStorage storage = null; 在启动期间,datanode读取其数据存储文件。 数据存储文件存储在所有dfs.data.dir目录中。 它包含版本和storageID。 Datanode在运行时会锁定所有dataStorage文件,因此其他datanode无法开始使用相同的数据存储。 当datanode停止(正常或异常)时,将释放锁定。
private static InetSocketAddress nameNodeAddr;
private static DataNode datanodeObject = null;
private class DataNodeMetrics {
private MetricsRecord metricsRecord = null; // 接口,指标记录,用于记录系统的状态信息
private long bytesWritten = 0L;
private long bytesRead = 0L;
private long blocksWritten = 0L;
private long blocksRead = 0L;
private long blocksReplicated = 0L;
private long blocksRemoved = 0L;
DataNodeMetrics() {
metricsRecord = Metrics.createRecord("dfs", "datanode");
} //初始化,设置记录
synchronized void readBytes(int nbytes) {
bytesRead += nbytes;
//实际作用为向metricsRecord中添加bytes_read =>bytesRead
Metrics.report(metricsRecord, "bytes_read", bytesRead);
}
synchronized void readBlocks(int nblocks) {
blocksRead += nblocks;
Metrics.report(metricsRecord, "blocks_read", blocksRead);
}
synchronized void wroteBlocks(int nblocks