hadoop源代码DatanodeProtocol

原文转自博客:http://www.oratea.net/?p=799,添加一些修改 。

DatanodeProtocol.java
路径:hadoop-0.19.2\src\hdfs\org\apache\hadoop\hdfs\server\protocol\DatanodeProtocol.java

DatanodeProtocol是DataNode与NameNode通信的信息接口,接口定义了DataNode向ameNode发起的全部操作。

1 public static final long versionID = 19L;

这个标识了协议的版本信息,对于0.19.2来说是19L。

2 final static int NOTIFY = 0;
final static int DISK_ERROR = 1;
final static int INVALID_BLOCK = 2;

定义了常见的错误编码

3 final static int DNA_UNKNOWN = 0;    // unknown action
final static int DNA_TRANSFER = 1;   // transfer blocks to another datanode
final static int DNA_INVALIDATE = 2; // invalidate blocks
final static int DNA_SHUTDOWN = 3;   // shutdown node
final static int DNA_REGISTER = 4;   // re-register
final static int DNA_FINALIZE = 5;   // finalize previous upgrade
final static int DNA_RECOVERBLOCK = 6;  // request a block recovery

定义了NameNode发送给DataNode的命令编码

4 public DatanodeRegistration register(DatanodeRegistration registration
) throws IOException;

在hdfs启动的时候,向NameNode注册该DataNode。registration表示DataNode的注册信息,
主要包含DataNode的机器名,DataNode的端口,storageID,infoserver的端口,ipc server的端口,StorageInfo等。

5  public DatanodeCommand[] sendHeartbeat(DatanodeRegistration registration,
long capacity,
long dfsUsed, long remaining,
int xmitsInProgress,
int xceiverCount) throws IOException;

在hdfs的工作过程中,定期向NameNode发送的心跳信息,告诉NameNode自己还是活着的,在发送心跳的过程中也会顺便发送一些DataNode的状态信息。
比如:当前DataNode的存储能力。已经空间,剩余空间等等。
发送心跳的频率由dfs.heartbeat.interval参数控制,默认是3秒。
NameNode接受到DataNode的心跳信息后,会将一些关于该DataNode的命令信息返回给DataNode,通过DatanodeCommand[]结构。

6  public DatanodeCommand blockReport(DatanodeRegistration registration,
long[] blocks) throws IOException;

在DataNode启动后会通过该方法向NameNode报告所有的本地存储的BLOCK的信息。
块信息存储在long数组blocks中,使用long代替Block类型是为了节省内存使用。

7  public void blockReceived(DatanodeRegistration registration,
Block blocks[],
String[] delHints) throws IOException;

该方法允许DataNode向NameNode报告最近接收到的Block信息。比如当该DataNode产生新的Block,或者其他的DataNode复制一个Block到该DataNode,
DataNode就会调用该方法向NameNode报告。

8  public void errorReport(DatanodeRegistration registration,
int errorCode,
String msg) throws IOException;

DataNode通过该方法向NameNode报告错误信息,主要为了调试

9  public NamespaceInfo versionRequest() throws IOException;

从NameNode获取NamespaceInfo信息,NamespaceInfo主要包含buildVersion和distributedUpgradeVersion信息。

10  UpgradeCommand processUpgradeCommand(UpgradeCommand comm) throws IOException;

该方法在分布式的升级过程中向NameNode发送命令信息。

11  public void reportBadBlocks(LocatedBlock[] blocks) throws IOException;

DataNode通过该方法向NameNode发送坏块的信息

12  public long nextGenerationStamp(Block block) throws IOException;

获得新的Stamp信息,Stamp是每个Block的版本信息

13  public void commitBlockSynchronization(Block block,
long newgenerationstamp, long newlength,
boolean closeFile, boolean deleteblock, DatanodeID[] newtargets
) throws IOException;

提交块的状态信息

原文地址:https://www.cnblogs.com/serendipity/p/2352568.html