Hadoop RPC API

Basic Use of RPC API

Posted by Spencer on January 21, 2017

一. 简述

  • 本文使用Hadoop的RPC框架简略模拟了HDFS客户端向NameNode查询元数据的过程
  • 项目结构如下 hadooprpc.png

二. 代码实现

  • 通信协议
    public interface ClientNamenodeProtocol {
      // 定义协议版本号
      public static final long versionID = 1L;
      // 定义通信接口
      public String getMetaData(String path);
    }
    
  • 服务器端实现业务功能
    public class MyNameNode implements ClientNamenodeProtocol {
    // 模拟查询元数据
      @Override
      public String getMetaData(String path) {
          return "This is  meta data from " + path +
              " : replication - x, block locations - xxx";
      }
    }
    
  • 发布服务器
    public class PublishServiceUtil {
        
      public static void main(String[] args) throws IOException {
          RPC.Builder builder = new RPC.Builder(new Configuration());
          builder.setBindAddress("localhost")
                  .setPort(8888)
                  .setProtocol(ClientNamenodeProtocol.class)
                  .setInstance(new MyNameNode());
    
          RPC.Server server = builder.build();
          server.start();
      }
    }
    
  • 客户端
    public class MyHDFSClient {
    
      public static void main(String[] args) throws IOException {
          InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 8888);
          ClientNamenodeProtocol nameNode = RPC.getProxy(ClientNamenodeProtocol.class, 1L, inetSocketAddress, new Configuration());
    
          String metaData = nameNode.getMetaData("/users/root/hello.txt");
          System.out.println(metaData);
      }
    }