NameNodeRpcServer 里面有两个主要的 RPC 服务:

  • clientRpcServer: 主要管理的协议是 Hdfs的客户端去操作HDFS的方法
  • 服务之间互相进行的方法的调用(注册、心跳等)
1
rpcServer = createRpcServer(conf);

根据代码的逻辑划分,主要有三部分:

  • 实例化各种通信协议和服务对象

    所有的服务都是 BlockingService 接口的实现,client和namenode之间进行通信需要调用的接口,包括:创建目录、管理block、设置权限等一些操作

    • 客户端同 NameNode 通信的协议服务: ClientNameNodeProtocolServerSideTranslatorPB
      • 负责创建目录
      • 管理block
      • 设置权限等
    • Datanode 同 NameNode 通信的协议服务: DatanodeProtocolServerSideTranslatorPB
      • Datanode 的启动时向NameNode注册
      • 发送心跳报告、block信息报告
  • 实例化监听 Datanode 请求的rpc server: ServerRpcServer

    实例化一个监听 Datanode请求的rpc server,并且将第一部分实例化的各种 ProtocolService 同此 rpc server 进行绑定,用于处理 rpc server 监听到的来自 Datanode 的各种rpc请求。

    这个服务是用来 Namenode 和 Datanode 之间的调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    this.serviceRpcServer = new RPC.Builder(conf)
    .setProtocol(
    org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolPB.class)
    .setInstance(clientNNPbService)
    .setBindAddress(bindHost)
    .setPort(serviceRpcAddr.getPort()).setNumHandlers(serviceHandlerCount)
    .setVerbose(false)
    .setSecretManager(namesystem.getDelegationTokenSecretManager())
    .build();
  • 实例化监听客户端请求的 rpc server: ClientRpcServer

    实例化一个监听客户端请求的rpc server,并将第一部分实例化的各种 ProtocolService 同此 rpc server 进行绑定,用于处理监听到的来自客户端的rpc请求。

    这个服务主要是用户使用客户端与 Namenode 和 Datanode 进行交互服务调用的

    1
    2
    3
    4
    5
    6
    7
    8
    this.clientRpcServer = new RPC.Builder(conf)
    .setProtocol(
    org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolPB.class)
    .setInstance(clientNNPbService).setBindAddress(bindHost)
    .setPort(rpcAddr.getPort()).setNumHandlers(handlerCount)
    .setVerbose(false)
    .setSecretManager(namesystem.getDelegationTokenSecretManager())
    .build();