导入依赖
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.7</version>
</dependency>
编写Hadoop RPC协议
public interface ClientProtocol {
long versionID = 1234L;
/**
* 创建目录
*/
void mkDir(String path);
}
编写Hadoop RPC 服务端
public class NameNodeRpcServer implements ClientProtocol {
/**************************************************************
* TODO_ZH https://www.cnblogs.com/starzy
* @Description: 创建目录
*/
public void mkDir(String path) {
System.out.println("服务器端:" + path);
}
/**************************************************************
* TODO_ZH https://www.cnblogs.com/starzy
* @Description: 构建Hadoop RPC并启动
*/
public static void main(String[] args) throws IOException {
/************************************************************
* TODO_ZH starzy https://www.cnblogs.com/starzy
* 注释:构建 Hadoop RPC 服务端
* 使用构建者模式进行构建 Hadoop RPC
*/
Server server = new RPC.Builder(new Configuration())
.setBindAddress("localhost")
.setPort(9999)
.setProtocol(ClientProtocol.class)
.setInstance(new NameNodeRpcServer())
.build();
System.out.println("服务端 Hadoop RPC 启动");
/**************************************************************
* TODO_ZH starzy https://www.cnblogs.com/starzy
* 注释:启动服务端Hadoop RPC
*/
server.start();
}
}
编写Hadoop RPC 客户端调用服务端
/***************************************************************
*TODO-ZH starzy https://www.cnblogs.com/starzy
* 注释: RPC 客户端
*/
public class HDFSClient {
public static void main(String[] args) throws IOException {
/*****************************************************************************************************
*TODO-ZH starzy https://www.cnblogs.com/starzy
* 注释: 获取服务端代理(客户端)
*/
ClientProtocol namenode = RPC.getProxy(ClientProtocol.class,
1234L,
new InetSocketAddress("localhost", 9999),
new Configuration());
/***************************************************************
*TODO-ZH starzy https://www.cnblogs.com/starzy
* 注释:调用服务端代码
*/
namenode.mkDir("/user/local/test");
}
}
Hadoop RPC特点
-
RPC指不同进程之间方法的调用,分别为客户端和服务端,并且是客户端调用服务端的方法,方法执行是在服务端
-
如果实现RPC调用,必须实现RPC协议且协议中必须定义versionID
-
服务端必须实现RPC协议
-
凡是jps命令看到的服务都是RPC服务端
-
构建RPC服务端通过构建者模式进行创建
Server server = new RPC.Builder(new Configuration()) .setBindAddress("localhost") .setPort(9999) .setProtocol(ClientProtocol.class) .setInstance(new NameNodeRpcServer()) .build();
-
RPC客户端通过RPC代理进行获取
ClientProtocol namenode = RPC.getProxy(ClientProtocol.class, 1234L, new InetSocketAddress("localhost", 9999), new Configuration());