Hadoop的 RPC机制的使用

来源:互联网 发布:吕雉与戚夫人知乎 编辑:程序博客网 时间:2024/05/16 00:42

1.RPC 概念
RPC:远程过程调用
(1)它允许一台计算机调用另一台计算机的子程序,不用关心底层网络通信细节,通常使用在分布式网络通信中。
(2)Hadoop 进程之间交互都是通过 RPC 来进行的,如 Namenode 与 Datanode 直接通信,jobtacker 与 Tasktracker 之间。
2.RPC 的特点
(1)透明性:远程调用其他机器的程序
(2)高性能:Server 并发处理来自多个 Client 的请求
(3)可控性:Java 中已经提供一个 RPC 框架,但是 Hadoop RPC 实现自定义的 RPC 框架
3.定义一个RPC通信接口。

/** * Created by hubo on 2017/11/30 * 定义一个 RPC 通信接口 */public interface LoginServiceProtocal {    final long versionID = 1L;  //版本号,不同版本号的 client 和 server 之间不能通信    String login(String username, String password);}

默认情况下,不同版本号的RPC Client和Server之间不能相互通信,因此客户端和服务端通过版本号标识。VERSION 就是版本号。
4.实现 RPC 协议
RPC 协议通常是一个 Java 接口,用户实现接口方法:

/** * Created by hubo on 2017/11/30 */public class LoginService implements LoginServiceProtocal{    @Override    public String login(String username,String password){        return "成功调用";    }}

5.构造 RPC server 并启动服务

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import org.apache.hadoop.ipc.Server;import java.io.IOException;/** * Created by hubo on 2017/11/30 */public class ServicePublisher {    public static int PORT = 5432;    public static String IPAddress = "127.0.0.1";    public static void main(String[] args) throws IOException {        Configuration conf = new Configuration();        RPC.Builder builder = new RPC.Builder(conf);        builder.setBindAddress(IPAddress)                .setPort(PORT)                .setProtocol(LoginServiceProtocal.class)                .setInstance(new LoginService());        Server server = builder.build();    //创建 sorck 服务器        server.start();    }}主要是创建的 RPC.Builder

6.构造 RPC Client 并发出请求

import HadoopRPC.LoginServiceProtocal;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import java.io.IOException;import java.net.InetSocketAddress;/** * Created by hubo on 2017/11/30 */public class ClientDemo {    public static int PORT = 5432;    public static String IPAddress = "127.0.0.1";    public static void main(String[] args) throws IOException {        LoginServiceProtocal loginService =                RPC.getProxy                        (LoginServiceProtocal.class,                        1L,                        new InetSocketAddress(IPAddress,PORT),                        new Configuration());        String result = loginService.login("angloaksd","1314521");        System.out.println(result);    }}

7.查看运行结果
(1)启动服务端,开始监听客户端请求
这里写图片描述
可以查看多出一个进程15411就是服务端启动成功
这里写图片描述
(2)启动客户端查看是否调用
这里写图片描述

原创粉丝点击