zoukankan      html  css  js  c++  java
  • Hadoop的RPC分析

    一、基础知识

      原理 http://www.cnblogs.com/edisonchou/p/4285817.html,这个谢了一些rpc与hadoop的例子。

      用到了java的动态代理,服务端实现一个接口,客户端得到这个接口的实现类,客户端通过自定义的versionID来标志一对服务端和客户端。

    二、代码

      2.1 接口

    package rpc;
    
    import org.apache.hadoop.ipc.VersionedProtocol;
    //默认情况下,不同版本号的RPC Client和Server之间不能相互通信,因此客户端和服务端通过版本号标识。
    
    public interface RPCable extends VersionedProtocol {
    	public static final long versionID = 10010;
    	public String sayHi(String name) ;
    	
    }
    

      我原来没继承VersionedProtocol接口,也成功了。接口不能在实现接口

      2.2 服务端

    package rpc;
    
    import java.io.IOException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.ProtocolSignature;
    import org.apache.hadoop.ipc.RPC;
    import org.apache.hadoop.ipc.RPC.Server;
    
    
    //动态代理:客户端和服务端同时实现一个接口
    //可以在linux和win下   
    //不同main进程下相互调用
    
    //是不同进程见的方法调用
    //底层走的是jav的rmi
    
    public class RPCServer implements RPCable{
    	
    	public String sayHi(String name) {
    		return "HI!"+name;
    	}
    
    	public static void main(String[] args) throws Exception {
    		// TODO Auto-generated method stub
    		Configuration conf = new Configuration();
    		//方法的调用连   因为每次调用返回的是this
    		Server server = new RPC.Builder(conf).setProtocol(RPCable.class).
    		setInstance(new RPCServer()).setBindAddress("localhost").
    		setPort(9527).build();
    		server.start();
    		  
    	}
    
    	@Override
    	public ProtocolSignature getProtocolSignature(String arg0, long arg1,
    			int arg2) throws IOException {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public long getProtocolVersion(String arg0, long arg1) throws IOException {
    		// TODO Auto-generated method stub
    		return 0;
    	};
    
    }
    

      我原来没继承VersionedProtocol类,那么服务端不需要下面的两个方法,继承了以后必须写。

      2.3 客户端

    package rpc;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    
    //打印在客户端  拼接字符串确实在服务端
    
    public class RPCClient {
    
    	public static void main(String[] args) throws Exception {
    		// TODO Auto-generated method stub
    		//协议一般是.class
    		RPCable proxy = RPC.getProxy(RPCable.class, 10010,
    				new InetSocketAddress("localhost",9527), new Configuration());
    		String res = proxy.sayHi("!!!!!!!!!!!!");
    		System.out.println(res);
    		RPC.stopProxy(proxy);
    	}
    
    }
    

    三、结束

      rpc不受系统、地理位置的限制。

      不相信的话可以在和护短打断点,一步一步发现进入了;额服务器端。

      做的时候如果不知道使用那个类哭下的东西,可以打开对应类的class文件,可能是黑色,不是源码,那么点击attach source找到hadoop的源码包就可以了,导进去就看到的是普通的和咱的java类似的文件,可以看看里面的蚕食来自那个包。

  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/hxsyl/p/6138292.html
Copyright © 2011-2022 走看看