欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hadoop学习笔记-prc通信原理

程序员文章站 2022-06-15 17:45:40
...

rpc(remote procedure call)

不同java进程间的对象方法调用

一方称作服务端(server),一方称作客户端(client)。

server端提供对象,供客户端调用,被调用的对象的方法的执行发生在server端。

 

rpc是hadoop框架运行的基础。

 

下面是一个基于hadoop的rpc框架的例子:

服务端代码:

 

package rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;

public class MyServer {
	public static final String SERVER_ADDRESS = "localhost";
	public static final int SERVER_PORT = 12345;
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		/** 构造一个 RPC server.
	     * @param instance 实例中的方法会被客户端调用
	     * @param bindAddress 绑定的地址用于监听连接的到来
	     * @param port 绑定的这个端口用于监听连接的到来
	     * @param conf the configuration to use
	     */
		final Server server = RPC.getServer(new MyBiz(), SERVER_ADDRESS, SERVER_PORT, new Configuration());
		server.start();
	}

}
MyBiz类为真正被调用的类,它实现了MyBizable接口中定义的hello()方法,getProtocolVersion()方法在MyBizable的父接口VersionedProtocol中定义;
package rpc;

import java.io.IOException;

public class MyBiz implements MyBizable{
	/* (non-Javadoc)
	 * @see rpc.MyBizable#hello(java.lang.String)
	 */
	@Override
	public String hello(String name){
		System.out.println("我被调用了!");
		return "hello" + name;
	}

	@Override
	public long getProtocolVersion(String protocol, long clientVersion)
			throws IOException {
		return MyBizable.VERSION;
	}
}
 MyBizable继承 VersionedProtocol接口

 

 

package rpc;

import org.apache.hadoop.ipc.VersionedProtocol;

public interface MyBizable extends VersionedProtocol{
	public static final long VERSION = 2345345234L;
	public abstract String hello(String name);

}
 

 

 下面是客户端代码:

package rpc;

import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class MyClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		/** 构造一个客户端的代理对象。 that implements the named protocol,
		   * talking to a server at the named address. */
		final MyBizable proxy = (MyBizable)RPC.waitForProxy(
				MyBizable.class,
				MyBizable.VERSION,
			      new InetSocketAddress(MyServer.SERVER_ADDRESS, MyServer.SERVER_PORT), 
			      new Configuration()
			      );
		final String result = proxy.hello("world");
		System.out.println("客户端调用结果"+result);
		
		RPC.stopProxy(proxy);
	}

}

 启动服务端:


hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
 执行客户端,输出:


hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
 服务端输出:


hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
 

总结:

1. 服务端提供的对象必须是一个接口,接口extends VersioinedProtocal

2. 客户端能够调用的对象中的方法必须位于对象的接口中

 

 

 

FileSystem与Namenode通过rpc通信过程,如图:
hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
 

 

  • hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
  • 大小: 41 KB
  • hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
  • 大小: 5.9 KB
  • hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
  • 大小: 11.9 KB
  • hadoop学习笔记-prc通信原理
            
    
    博客分类: hadoop hadooprpcnamenode 
  • 大小: 34.9 KB