HDFS源码分析(7):datanode的启动与服务

March 30, 2012 / datanode, Hadoop, HDFS, service, source, startup

前提

Hadoop版本:hadoop-0.20.2

概述

datanode在启动后,会定期向namenode发送心跳报告,并处理namenode返回的命令,经过前面的分析,已经基本弄清楚datanode相关的类,本文将分三部分对剩下的Datanode这个类进行分析,分别是datanode的启动、公共接口和运行。Datanode位于org.apache.hadoop.hdfs.server.datanode这个包,类图如下所示:

datanode的启动

首先,先看看Datanode的静态初始化块:

  static{
    Configuration.addDefaultResource("hdfs-default.xml");
    Configuration.addDefaultResource("hdfs-site.xml");
  }

也就是说,datanode在启动时会加载hdfs-default.xml和hdfs-site.xml这两个配置文件,默认的配置文件hdfs-default.xml位于src/hdfs目录,非hadoop-0.20.2可能路径会不相同,最终会跟生成的class文件一起打包进hadoop-core-*.jar,一般与datanode相关的配置放在hdfs-site.xml这个配置文件中。

下面,从入口main方法开始,逐步分析datanode的初始化与启动。

1. main:

2. createDataNode:

3. instantiateDataNode:

4.makeInstance:

5.DataNode:

6.startDataNode:

datanode的接口

getProtocolVersion:

取得datanode的协议版本。

getBlockMetaDataInfo:

取得块元数据信息。

updateBlock:

更新块信息,这个方法会更改块的时间戳,所有会重命令元数据信息文件,如果块文件的长度有变,会改变块文件和元数据信息文件的内容。

recoverBlock:

恢复一个块,先检查块的时间戳,对时间戳比本地块要新的datanode做同步块操作,在同步时,调用namenode的nextGenerationStamp方法来得到一个新的时间戳,对每个datanode通过RPC调用updateBlock方法来更新远程datanode的块,最后调用namenode的commitBlockSynchronization方法来提交块的更新。

datanode的运行

首先会启动DataXceiverServer,然后进入datanode的正常运行:

来看看offerService这个方法是如何执行的:

接下来看processCommand方法是如何处理命令的,关于这些命令对应的操作,之前的文章中已经提到过,这些操作在DatanodeProtocol中定义:

除了以上的操作,还支持UpgradeCommand.UC_ACTION_START_UPGRADE这个操作,主要用于HDFS的升级。

datanode的相关配置

以下是与datanode相关的配置,括号中是配置的默认值:

后记

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