• rpc,客户端与NameNode通信的过程


    远程过程:java进程.即一个java进程调用另外一个java进程中对象的方法.

    调用方称作客户端(client),被调用方称作服务端(server).rpc的通信在java中表现为客户端去调用服务端对象中的方法.RPC通信就是cs结构的通信.client端会知道服务端被调用对象的接口.
    RPC是hadoop分布式机制运行的基础.

    代码示例:

    接口:MyBizable

    public interface MyBizable extends VersionedProtocol{
    	public static final int PORT = 123456 ;
    	public abstract String hello(String name);
    	public abstract long getProtocolVersion(String protocol,long clientVersion)throws IOException;
    }
    

    接口对应的实现类:MyBiz

    public class MyBiz implements MyBizable {
    	@Override
    	public long getProtocolVersion(String protocol, long clientVersion)
    			throws IOException {
    		return MyBizable.PORT;
    	}
    	@Override
    	public String hello(String name) {
    		System.out.println("我被调用了.");
    		return "hello "+ name;
    	}
    }
    

    服务类:MyServer

    public class MyServer {
    	public static final String ADDRESS = "localhost";
    	public static final int PORT = 2454;
    	public static void main(String[] args) throws Exception{
    		/**
    		 * 构造一个RPC的服务端
    		 * @param instance 实例对象的方法会被客户端调用。
    		 * @param bindAddress 监听绑定的地址
    		 * @param port 监听连接的端口
    		 * @param conf 配置
    		 */
    		Server server = RPC.getServer(new MyBiz(), MyServer.ADDRESS, MyServer.PORT, new Configuration());
    		server.start();
    	}
    }
    

    客户端:MyClient

    public class MyClient {
    	public static void main(String[] args) throws Exception{
    		MyBizable client =
                  (MyBizable) RPC.getProxy(MyBizable.class, MyBizable.PORT, new InetSocketAddress(MyServer.ADDRESS,MyServer.PORT), new Configuration()); String result = client.hello("world"); System.out.println(result); } }

    客户端与NameNode通信的过程:

      NameNode本身就是一个RPC的服务端,主要实现的接口有:ClientProtocol,DatanodeProtocol,NamenodeProtocol

      ClientProtocol:是我们客户端(FileSystem)与NameNode通信的接口.

      DatanodeProtocol:是DataNode和NameNode通信的接口.

      

      DFSClient:直接调用NameNode接口的对象.

            用户代码是通过DistributedFileSystem调用DFSClient对象,才能与NameNode打交道.

      我们的RPC客户端实际上是DFSClient,服务端是NameNode.

      NameNode为什么要用rpc机制?

        RPC是远程过程调用,会起多个java进程,并且之间进行通信的时候用的是Scoket通信,也就意味着RPC通信客户端和服务端不见得是在位于同一台机器上,因为socker通信可以指定ip和端口,意味着我们整个完整的hadoop体系结构是可以分散在多个进程,多个不同的服务器之上的,所以我们的NameNode作为其中的一部分,必然也是需要实现RPC机制的.可以让我们一个完整的软件程序运行在不同的服务器上,实现分布式.

  • 相关阅读:
    一些常用的方法(1)--去除DataTable中的重复数据
    皕杰报表入门知识(1)
    Red Hat 6.0 Linux系统跳过登录界面直接进入系统
    解决pycharm无法获取安装包文件列表
    sqlalchemy创建数据库自动映射
    python3使用importlib来重复加载模块
    python3使用exec来动态加载模块
    中间件datasnap用流传递数据
    使用fdmemTable来代替clientDataset,解决MySQL5.6(含)以上版本用cds多次更新时的错误
    dxSpreadSheet动态切换Sheet
  • 原文地址:https://www.cnblogs.com/xiaolong1032/p/4401110.html
Copyright © 2020-2023  润新知