HDFS1.0源代码解析—DataNode类主要数据成员和函数

11 篇文章 0 订阅
10 篇文章 0 订阅
DataNode.java主要包含三个类DataNode主类、DataTransfer和BlockRecord辅助类。一、看主类DataNode:1、主要的数据成员 public DatanodeProtocol namenode = null; public FSDatasetInterface data = null; public DatanodeRegistration d
摘要由CSDN通过智能技术生成
DataNode.java主要包含三个类DataNode主类、DataTransfer和BlockRecord辅助类。
一、看主类DataNode:
1、主要的数据成员 
public DatanodeProtocol namenode = null;
  public FSDatasetInterface data = null;
  public DatanodeRegistration dnRegistration = null;
  volatile boolean shouldRun = true;
  private LinkedList<Block> receivedBlockList = new LinkedList<Block>();
  /** list of blocks being recovered */
  private final Map<Block, Block> ongoingRecovery = new HashMap<Block, Block>();
  private LinkedList<String> delHints = new LinkedList<String>();
  public final static String EMPTY_DEL_HINT = "";
  AtomicInteger xmitsInProgress = new AtomicInteger();
  Daemon dataXceiverServer = null;
  ThreadGroup threadGroup = null;
 DataNodeInstrumentation myMetrics;   
 private Thread dataNodeThread = null;   public DataBlockScanner blockScanner = null;      
 public Daemon blockScannerThread = null;       
 public Server ipcServer; 

namenode :执行NN RPC调用的对象。

data :DN上管理存储数据结构的对象,对于FSDataset后面会继续讨论。

dnRegistration :存储NN需要的所有的DN的信息。

receivedBlockList :记录DN接受到的数据块的链表,通过该数据结构向NN报告接收到的block的信息

ongoingRecovery:记录正在进行recovery的block

delHints :receivedBlockList 的副本,暂时没有弄清楚使用两个相同链表的原因害羞

myMetrics:记录DN的运行过程中的一些信息。dataNodeThread :DN的主线程。

dataXceiverServer:DN上接受数据的线程

threadGroup :建立一个线程组,主要管理dataXceiverServer和recoverBlocks的线程,有针对线程组的函数,方便对多个线程进行操作。

blockScanner与blockScannerThread:对DN上的block进行扫描处理,具体见BlockScanner类的介绍

ipcServer:管理不同DN之间进行数据传输

2、主要的成员函数:

private NamespaceInfo handshake() throws IOException {
从NN获取version和id的信息。
 private void register() throws IOException {  
向NN报告DN的一些元信息,包括layoutVersion、namespaceID、cTime。同时从NN获得registrationID。
 private void transferBlock( Block block,
                              DatanodeInfo xferTargets[]
                              ) throws IOException {

该函数负责在DN直接进行数据传输,首先进行检查,确保传输的数据正确后,启动一个专门的线程进行传输。该线程后边会进行专门的介绍。

  protected void notifyNamenodeReceivedBlock(Block block, String delHint) { 
函数名容易让人产生歧义,其实该函数做的只是见添加的block加入到数据结构receivedBlockList中,在后续的函数中会根据receivedBlockList决定是否通知NN。
  public void run() {   
 	while (shouldRun) {
      try {
        startDistributedUpgradeIfNeeded();
        offerService();
      } catch (Exception ex) {
        LOG.error("Exception: " + StringUtils.stringifyException(ex));
        if (shouldRun) {
          try {
            Thread.sleep(5000);
          } catch (InterruptedException ie) {
          }
        }
该函数一直执行直到shouldRun变为false,在循环中一直调用offerService函数,在出现任何异常的情况下都最大可能的提供服务,就是不断的与NN就行交互,发送心跳、接受到block的情况等。

 public BlockRecoveryInfo startBlockRecovery(long blockId) 
该方法暂时还是没有看明白。<pre 剩余的其他方法都是简单方法,不再一一介绍。

二、辅助类 DataTransfer

 DataTransfer是一个线程类,负责进行DN之间的数据传输。主要流程跟client与DN之间的传输类似,先建立连接,发送元信息(需要发送到几个DN等等),最后发送数据内容。

 三、辅助类BlockRecord

该类的作用只是定义一种数据类型,用于blockrecovery,好吧这个过程我还没有搞清楚。至此整个DataNode类终于纠结完了,虽然还有一些地方不清楚,欢迎大家讨论。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值