HDFS源码分析(2):datanode协议

March 7, 2012 / datanode, HDFS, protocol, source

前提

Hadoop版本:hadoop-0.20.2

概述

datanode协议包括基本的数据结构、调用接口以及通信的内容,本文中将简单分析这几部分内容,所涉及到的类的包结构如下所示:

数据结构

datanode涉及的数据结构包括datanode信息、块、块元数据、datanode命令等,这些结构均实现Writable接口,可进行序列化。

与datanode信息相关的类图如下所示:

DatanodeInfo保存着datanode的详细信息,如名字、ID、端口、容量、已使用空间、剩余空间、DataXceiver的个数、位置、状态等,namenode、balancer和管理工具都会使用到这些信息。

DatanodeRegistration包含标识datanode的所有信息,datanode在启动时,向namenode进行注册,之后在与namenode通信时会发送这些信息验证datanode的身份。

StorageInfo是关于存储的,后继会介绍。

与块相关的类图如下所示:

与块相关的类主要有块、块元数据以及带位置信息的块。

Block保存块的信息,有块ID、块文件大小以及由namenode生成的时间戳,由ID和时间戳唯一确定一个块。

BlockMetaDataInfo保存块元数据的信息,比块多了一个最后扫描时间。

LocatedBlock的主要属性有块信息、该块在文件中的偏移量以及存储该块的datanode节点的信息,主要用在HDFS客户端,它告诉客户端去哪找到块文件。

与datanode命令相关的类图如下所示:

DatanodeCommand是datanode向namenode发送心跳、报告块后会返回的结构,datanode会对收到的命令进行相应的操作,该结构的主要属性是action,是命令对应的操作,这些操作在DatanodeProtocol中定义:

Register、Finalize、BlockCommand和UpgradeCommand是DatanodeCommand的子类。

BlockCommand额外保存了块和datanode的信息,用于通知datanode错误的块或将指定的块发送到另一个datanode。

UpgradeCommand用于升级HDFS。

接口

这部分主要分析通信过程中需要遵守的一些协议,主要是几个接口,如下类图所示:

VersionedProtocol是所有使用Hadoop RPC的协议的父类,该接口定义了获得协议版本的方法。

DatanodeProtocol是datanode用来和namenode通信的协议,用于上传当前的负载信息和块报告,namenode只能通过该接口定义的方法的返回值与datanode通信,主要方法有注册、发送心跳、报告块信息、通知已接收到的块、报告错误、报告坏块和获得时间戳等。

InterDatanodeProtocol是一个datanode之间的协议,用于更新时间戳。

ClientDatanodeProtocol是一个client-datanode之间的协议,用于恢复块。

后记

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