1. hadoop远程过程调用
RPC:XML-RPC,JSON-RPC,CORBA,RMI(Remote Method Invocation),Haoop IPC(进程间通信)
RPC原理:允许本地程序(客户端)调用其他机器(服务器)上的过程,客户端使用参数将信息传送给调用方,通过返回值得到消息。
RPC的server在运行时会阻塞在接收消息的调用上,当接到客户端的请求后,会解包以获取请求参数;结束后返回值通过主程序打包发送给客户端。
依赖于java序列化机制
运行一个jvm里的java程序调用另一个jvm里的程序,客户端保留一个调用对象的接口,通过接口方式调用方法。而接口实际执行是在服务端,服务端才具有调用对象的实例,客户端可以简单理解为仅是一个代理。
远程对象,实现了一个或多个远程接口,远程接口声明了可以由外部系统调用的对象方法。(远程只是一个修饰语)
1、 定义一个远程接口(实验是失败的)
实际代码:
package test.rmi; import java.io.Serializable; import java.rmi.Remote; import java.rmi.RemoteException; //必须继承Remote接口 //必须实现Serializable,增加序列化功能 public interface RMIQueryStatus extends Remote,Serializable{ //方法必须抛出RemoteException异常 String getFileName(String fileName) throws RemoteException; } 2、定义一个远程对象的实现类 package test.rmi; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus{ //声明一个版本ID(必须要有吗?可以试试) private static final long serialVersionUID = 1L; public RMIQueryStatusImpl() throws RemoteException { super(); // TODO Auto-generated constructor stub } @Override public String getFileName(String fileName) throws RemoteException { // TODO Auto-generated method stub return fileName+" ,good,you get it!"; } } 3、开启JAVA RMI注册服务 在cmd下运行rmiregistry (使用默认端口12090)可以增加 如rmiregistry 10000,即使用10000端口 5、 编写服务端主程序 package test.rmi; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class RMIQueryStatusServer { public static void main(String[] args) throws Exception { //创建远程对象实例 RMIQueryStatusImpl rmiObj = new RMIQueryStatusImpl(); //使用本地端口,12090 LocateRegistry.createRegistry(12090); //绑定远程对象到名字 Naming.rebind("RMI_URL", rmiObj); System.out.println("Server is ready."); } }
运行报错(解决不了):
java.lang.ClassNotFoundException: test.rmi.RMIQueryStatus
5、客户端程序:
package test.rmi; import java.rmi.Naming; public class RMIQueryStatusClient { public static void main(String[] args) throws Exception{ //从注册点获取一个远程对象 RMIQueryStatus remoteObj = (RMIQueryStatus) Naming.lookup("RMI_URL"); //调用方法 String res = remoteObj.getFileName("hello"); //输出结果 System.out.println(res); } }
--不知道书中是如何成功的。有时间将这个问题解决一下
Hadoop技术内幕HDFS-笔记4之远程调用,布布扣,bubuko.com
原文:http://www.cnblogs.com/jsunday/p/3817446.html