第一部分:什么是RPC
RPC (Remote Procedure Call Protocol) – 远程过程协议调用 。通过 RPC 我们可以从网络上的计算机请求服务,而不需要了 解底层网络协议。 Hadoop 底层的交互都是通过 rpc 进行的。例 如: datanode 和 namenode 、 tasktracker和 jobtracker 、 secondary namenode 和 namenode 之间的通信都是通过 rpc 实 现的。
RPC 模式
RPC 采用客户机 / 服务器 模式 。请求程序就是一个客户机, 而服务提供程序就是一个服务器。首先,客户机调用进程发送 一个有进程参数的调用信息到服务进程,然后等待应答信息。 在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答 复信息,然后等待下一个调用信息,最后, 客户端 调用进程接 收答复信息,获得进程结果,然后调用执行继续进行。
Server:
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 sayHi(String name){
return "HI ~ " + name;
}
public static void main(String[] args) throws Exception {
Server server= new RPC.Builder(new Configuration()).setInstance(new RPCServer()).setProtocol(Bizable.class).setBindAddress("127.0.0.1").setPort(9527).build();
server.start();
}
}
Client:
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class TestClient {
public static void main(String[] args) throws IOException {
Bizable proxy = RPC.getProxy(Bizable.class, 10010,new InetSocketAddress("127.0.0.1", 9527), new Configuration());
String result = proxy.sayHi("test");
System.out.println(result);
RPC.stopProxy(proxy);
}
}
Interface:
public interface Bizable {
public static final long versionID = 10010;
public String sayHi(String name);
}