(1)VersionedProtocol
Superclass of all protocols that use Hadoop RPC.协议是Hadoop RPC的最顶层协议接口的抽象。 (2)ClientProtocol
ClientProtocol是hdfs客户端与NameNode通信的信息接口,接口定义了所有的操作,比如打开或者关闭文件等等。当客户端进程想要与Namenode进程进行通信的时候,需要通过org.apache.hadoop.hdfs.DistributedFileSystem类,基于ClientProtocol协议来实现交互过程。用户代码通过ClientProtocol协议,可以操纵HDFS的目录命名空间、打开与关闭文件流等。 ClientProtocol提供给客户端,用于访问NameNode。它包含了文件角度上的HDFS功能。一般来说,程序员通过org.apache.hadoop.fs.FileSystem来和HDFS打交道,不需要直接使用该接口。 主要方法说明:
当接收到Datanode的命令的时候,根据下述状态码确定Datanode应该执行何种操作
final static int DNA_UNKNOWN = 0;
// unknown action
final static int DNA_TRANSFER = 1;
// transfer blocks to another datanode
// 将数据块从一个Datanode转移到另一个Datanode
final static int DNA_INVALIDATE = 2;
// invalidate blocks// 未验证数据块
final static int DNA_SHUTDOWN = 3;
// shutdown node// 关闭Datanode
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// 数据块恢复操作请求
final static int DNA_ACCESSKEYUPDATE = 7;
// update access key
final static int DNA_BALANCERBANDWIDTHUPDATE = 8;
// update balancer bandwidth 主要方法:
1) DatanodeRegistration register(DatanodeRegistration registration)
在hdfs启动的时候,向NameNode注册该DataNode。registration表示DataNode的注册信息,主要包含DataNode的机器名,DataNode的端口,storageID,infoserver的端口,ipc server的端口,StorageInfo等
2) 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[]结构。
3) DatanodeCommand blockReport(DatanodeRegistration registration,long[] blocks)
在DataNode启动后会通过该方法向NameNode报告所有的本地存储的BLOCK的信息。块信息存储在long数组blocks中,使用long代替Block类型是为了节省内存使用
4) void blocksBeingWrittenReport(DatanodeRegistration registration,
long[] blocks) throws IOException;
5) void blockReceived(DatanodeRegistration registration,
Block blocks[],
String[] delHints) throws IOException;
该方法允许DataNode向NameNode报告最近接收到的Block信息。比如当该DataNode产生新的Block,或者其他的DataNode复制一个Block到该DataNode,DataNode就会调用该方法向NameNode报告。
6) public NamespaceInfo versionRequest() throws IOException;
从NameNode获取NamespaceInfo信息,NamespaceInfo主要包含buildVersion和distributedUpgradeVersion信息。