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;
提交块的状态信息