本文通俗易懂.
rpc是远程或者跨进程调用方法或传输信息的一种通信,基本过程是Client通过RPC.getProtocolProxy()获取代理类ProtocolProxy然后调用Server,在Server端调用的方法运行,并讲Server的运行结果返回给Client;
不多说下面开始代码演示,首先在eclipse中建立项目,加入hadoop中基本的jar包,这里为了方便我是使用的eclipse-hadoop插件,具体方法参考本人另一篇文章,创建了M-R project,没有手工导入jar
首先编写server类,实现server中的一个方法,在实例化server时候配置server的地址(ip+port)等信息,注意这个ip地址为Server端的地址
package rpc;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
public class RpcServer implements Bizable {
public String sysHi(String name) {
return "Hi~" + name;
}
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
Configuration conf = new Configuration();
Server server = new RPC.Builder(conf).setProtocol(Bizable.class).setInstance(new RpcServer())
.setBindAddress("192.168.2.10").setPort(9527).build();
server.start();
}
}
由于client调用使用了代理模式,需要Server的一个接口,这里创建接口如下
package rpc;
public interface Bizable {
public static final long versionID = 1L;
public String sysHi(String name);
}
接下来开始编写client类,通过RPC工厂创建Server的代理类ProtocolProxy类,使用getProxy()获取实例对象,然后调用Server的sysHi()方法,在实例化过程中已经讲Server的ip,port等信息填好了
package rpc;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.ProtocolProxy;
import org.apache.hadoop.ipc.RPC;
public class RpcClient {
public static void main(String[] args) throws IOException {
ProtocolProxy<Bizable> proxy = RPC.getProtocolProxy(Bizable.class, 1L, new InetSocketAddress("192.168.2.10",9527), new Configuration());
String result = proxy.getProxy().sysHi("tomcat");
System.out.println(result);
}
}
可以在eclipse上调试运行,为了完全模拟,这里讲做好的代码打包为jar文件,并讲Server类的jar传到另外一个虚拟机中,用于真机模拟,注意配置的ip为虚拟机的ip,打包方法如下
项目右击export然后选择jar为runable jar下一步,如下图选择
将导出的jar文件copy到虚拟机,由于我主机系统就是ubuntu,所以美食用传输工具
hadoop@hadoop:~$ ls
bahsrc.bak Downloads Pictures test.java zookeeper.out
conf examples.desktop Public Videos
Desktop fairscheduler.xml rpcServer.jar workspace
Documents Music Templates Workspaces
hadoop@hadoop:~$ scp rpcServer.jar hadoop1:/home/hadoop/
rpcServer.jar 100% 46MB 11.5MB/s 00:04
同样以类似方法导出client的jar文件,注意选择的Launch configuration为RpcClient的类,如下图
然后在虚拟机中启动server
hadoop@hadoop:hadoop-2.7.2$ ssh hadoop1
Last login: Sat May 21 13:55:01 2016 from hadoop
[hadoop@hadoop1 ~]$ ls
rpcServer.jar zookeeper.out
[hadoop@hadoop1 ~]$ java -jar rpcServer.jar
log4j:WARN No appenders could be found for logger (org.apache.hadoop.ipc.Server).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
然后在本机运行client,就可以看到成功运行了Server中的sys()方法并获取到了结果
hadoop@hadoop:~$ java -jar rpcClient.jar
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hi~tomcat
hadoop@hadoop:~$
如果不运行Server,Client是不可能得到结果,一直处于等待状态
到此,模拟结束