分布式系统详解--框架(Hadoop--RPC协议)
在之前的一篇文章当中已经写过一篇文章是关于RPC通信协议的文章,是 分布式系统详解--基础知识(通信)。是讲的关于网络通信的最基本的知识。这篇文章也简单讲一下关于hadoop内部的网络通信。
一、hadoop的RPC模式
C/S模式
基于传输层模式。(TCP/IP)
事件处理模型。(请求、计算、协议)
二、RPC设计目的
调用非本机方法。
不同语言程序之间通讯。
不了解底层通讯,向本地方法一样调用。
三、RPC作用
分布式程序基础(分布式操作系统、分布式计算、分布式软件设计)
垂直应用服务化拆分。
四、RPC特点
封装网络交互
远程调用对象代理
支持容器(Spring、Jetty)
可配置,可扩展
五、hadoop 主要协议
NameNode主要实现了ClientProtocol、DataNodeProtocol、NameNodeProtocol。
Hadoop2.0中存在两个ipc包,分别在hadoop-common和hadoop-yarncommom项目下。分别是hadoop RPC和新的yarn RPC。
六、JAVA代码实现简单hadoop-RPC简单实现测试
6.1 协议接口
/** * */ package com.yuyi.rpc; /** * @author mcb * * 2018年10月15日 上午11:08:02 * RPC中的协议 */ public interface SayHello { public static final long versionID=1; //协议 public String sayHello(String words); }
6.2 服务端接口
/** * */ package com.yuyi.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; /** * @author mcb * * 2018年10月15日 上午11:10:50 * RPC中的服务端 实现协议 * */ public class RPCServer implements SayHello{ public String sayHello(String words) { // TODO 自动生成的方法存根 System.out.println("客户端说的话是: "+words); return "OK~我知道你没有挂掉了~~~"; } public static void main(String[] args) { try { Server server = new RPC.Builder(new Configuration()) .setInstance(new RPCServer()) .setProtocol(SayHello.class) .setBindAddress("127.0.0.1") .setPort(6666) .build(); server.start(); System.out.println("server is started... "); } catch (HadoopIllegalArgumentException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
6.3 客户端接口
/** * */ package com.yuyi.rpc; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; /** * @author mcb * * 2018年10月15日 上午11:20:11 */ public class RPCClient { private static String sayHello; public static void main(String[] args) { //第一个参数:协议 第二份参数:版本(long整数),第三个参数:地址,第四个参数:configuration。 try { while (true) { SayHello sayH = RPC.getProxy(SayHello.class, 1, new InetSocketAddress("127.0.0.1",6666), new Configuration()); sayHello = sayH.sayHello("我现在活着,心跳正在进行~~~"); System.out.println(sayHello); Thread.sleep(2000); } } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }
启动后结果: