hadoop(0.1.1.2)源码学习-org.apache.hadoop.dfs DataNode

本文详细介绍了Hadoop 0.1.1.2版本中DataNode类的设计与实现,包括DataNode的职责、核心组件如DatanodeProtocol、FSDataset、DataNodeMetrics等,并展示了如何处理心跳、块报告和数据传输等关键操作。通过源码学习,可以深入理解Hadoop早期版本的数据节点工作原理。
摘要由CSDN通过智能技术生成

今天正式开始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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值