您的位置:首页 > 运维架构

Hadoop技术内幕HDFS-笔记4之远程调用

2014-06-30 23:00 357 查看
1. hadoop远程过程调用

RPC:XML-RPC,JSON-RPC,CORBA,RMI(Remote Method Invocation),Haoop IPC(进程间通信)

RPC原理:允许本地程序(客户端)调用其他机器(服务器)上的过程,客户端使用参数将信息传送给调用方,通过返回值得到消息。





RPC的server在运行时会阻塞在接收消息的调用上,当接到客户端的请求后,会解包以获取请求参数;结束后返回值通过主程序打包发送给客户端。

1.1. java RMI

依赖于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);
}
}


--不知道书中是如何成功的。有时间将这个问题解决一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: