在学习一个优秀框架的源码之前,我们需要了解一些基础的知识,这次说的就是Hadoop的通信架构,那Hadoop的底层通信架构是什么呢?Netty?Akka?都不是,是Hadoop自己封装的,在这儿先称作Hadoop RPC吧
当然这篇文章只是来描述如何简单来使用Hadoop RPC,首先什么是RPC?
Hadoop RPC
RPC(remote procedure call):远程过程调用
远程:不同进程(例如服务器A和服务器B的2个进程)
过程:方法/函数
就是不同进程的方法的调用,也可以说客户端调用服务端的方法(客户端和服务端默认不在一个进程)
HadoopRPC的特点
- 客户端调用服务端,方法的执行是服务端
- 实现RPC的调用,需要一个协议(接口),里面必须有versionID
- 服务端需要实现这个协议
Hadoop RPC协议
public interface RpcProtocol {
// 必须存在的属性,有兴趣可以试试去掉这个属性(序列化问题)
long versionID = 111L;
void sayHi(String name);
}
Hadoop RPC服务端
public class RpcServer implements RpcProtocol {
@Override
public void sayHi(String name) {
System.out.println("hi, " + name);
}
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
RPC.Server client = new RPC.Builder(conf)
.setProtocol(RpcProtocol.class)
.setInstance(new RpcServer())
.setBindAddress("localhost")
.setPort(1234)
.build();
System.out.println("client started");
client.start();
}
}
直接启动服务端
Hadoop RPC客户端
public class RpcClient {
public static void main(String[] args) throws IOException {
RpcProtocol proxy = RPC.getProxy(
RpcProtocol.class,
// 不需要和"协议"的versionID一致
1231231L,
new InetSocketAddress("localhost", 1234),
new Configuration()
);
System.out.println("client start");
proxy.sayHi("Jshenp");
System.out.println("client end");
}
}
代码很简单,结果很明显,大家自己试试
当然我们使用jps命令是能看到对应的服务端进程的哦
通过代码,我们在加点场景
假设我们要访问HDFS上的一个文件,我们会和NameNode进行通信,在这个场景下,我们就是客户端,NameNode就是服务端,接下来我们又需要和服务端拿文件块,服务端就变成DataNode了,这样Hadoop就实现了最基本的通信功能,也了解Hadoop的底层通信通信如何