分布式系统详解--框架(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();
}
}
}
启动后结果:
欢迎订阅公众号(JAVA和人工智能)
获取更过免费书籍资源视频资料
知识点超级链接:
12,分布式系统详解--框架(Hadoop-Ssh免密登陆配置)